++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? ++ -- 这类问题很复杂,不同的编译器会有不同的答案。 这是 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 首先要明确一点: ++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]