sssuhl 发表于 2020-2-27 12:37:26

++a

本帖最后由 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?

zltzlt 发表于 2020-2-27 12:40:44

++ -- 这类问题很复杂,不同的编译器会有不同的答案。

一个账号 发表于 2020-2-27 12:49:39

这是 Dev-C++ 使用默认编译器的汇编程序:

   0x0000000000401530 <+0>:        push   %rbp
   0x0000000000401531 <+1>:        mov    %rsp,%rbp
   0x0000000000401534 <+4>:        sub    $0x30,%rsp
   0x0000000000401538 <+8>:        callq0x402100 <__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>:        callq0x402b18 <printf>
=> 0x0000000000401569 <+57>:        mov    $0x0,%eax
   0x000000000040156e <+62>:        add    $0x30,%rsp
   0x0000000000401572 <+66>:        pop    %rbp
   0x0000000000401573 <+67>:        retq   

一个账号 发表于 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
页: [1]
查看完整版本: ++a