鱼C论坛

 找回密码
 立即注册
查看: 1931|回复: 3

[已解决]++a

[复制链接]
发表于 2020-2-27 12:37:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sssuhl 于 2020-2-27 12:37 编辑
#include <stdio.h>

int main ()
{
        int a;
        a = 4;
        
        printf("%d", (++a)+(++a)+(++a));
        
        return 0;
}
为啥结果不是5+6+7=18?
最佳答案
2020-2-27 12:55:47
首先要明确一点: ++a这个表达式的计算结果就是+1之后的a, 而不是a+1的结果数值

b=(++a)+(++a)+(++a)

依据从左向右的顺序, 相当于b=((++a)+(++a))+(++a)

所以它的计算过程如下(这里就是"脱括号"的过程了, a=0)

b=(a+(++a))+(++a),           第一次脱括号的结果, 这时a=1

b=(a+a)+(++a),                  第二次脱括号的结果. 这时a=2

b=(2+2)+(++a),  

b=4+(++a)                         第三次脱括号的结果, 这时a=2

b=4+a                                第四次脱括号的结果, 这时a=3

b=4+3=7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-27 12:40:44 | 显示全部楼层
++ -- 这类问题很复杂,不同的编译器会有不同的答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 12:49:39 | 显示全部楼层
这是 Dev-C++ 使用默认编译器的汇编程序:
   0x0000000000401530 <+0>:        push   %rbp
   0x0000000000401531 <+1>:        mov    %rsp,%rbp
   0x0000000000401534 <+4>:        sub    $0x30,%rsp
   0x0000000000401538 <+8>:        callq  0x402100 <__main>
   0x000000000040153d <+13>:        movl   $0x4,-0x4(%rbp)
   0x0000000000401544 <+20>:        addl   $0x1,-0x4(%rbp)
   0x0000000000401548 <+24>:        addl   $0x1,-0x4(%rbp)
   0x000000000040154c <+28>:        mov    -0x4(%rbp),%eax
   0x000000000040154f <+31>:        lea    (%rax,%rax,1),%edx
   0x0000000000401552 <+34>:        addl   $0x1,-0x4(%rbp)
   0x0000000000401556 <+38>:        mov    -0x4(%rbp),%eax
   0x0000000000401559 <+41>:        add    %edx,%eax
   0x000000000040155b <+43>:        mov    %eax,%edx
   0x000000000040155d <+45>:        lea    0x2a9c(%rip),%rcx        # 0x404000
   0x0000000000401564 <+52>:        callq  0x402b18 <printf>
=> 0x0000000000401569 <+57>:        mov    $0x0,%eax
   0x000000000040156e <+62>:        add    $0x30,%rsp
   0x0000000000401572 <+66>:        pop    %rbp
   0x0000000000401573 <+67>:        retq   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 12:55:47 | 显示全部楼层    本楼为最佳答案   
首先要明确一点: ++a这个表达式的计算结果就是+1之后的a, 而不是a+1的结果数值

b=(++a)+(++a)+(++a)

依据从左向右的顺序, 相当于b=((++a)+(++a))+(++a)

所以它的计算过程如下(这里就是"脱括号"的过程了, a=0)

b=(a+(++a))+(++a),           第一次脱括号的结果, 这时a=1

b=(a+a)+(++a),                  第二次脱括号的结果. 这时a=2

b=(2+2)+(++a),  

b=4+(++a)                         第三次脱括号的结果, 这时a=2

b=4+a                                第四次脱括号的结果, 这时a=3

b=4+3=7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表