#include <iostream>using namespace std;int main(){ int a,b;
a=5;
a=a+(a++);
cout<<a<<endl;
a=5;
b=a+(a++);
cout<<b<<endl; return 0;
}求一个详细的解释
2 回答
一只甜甜圈
TA贡献1836条经验 获得超5个赞
#include <iostream>using namespace std;int main(){ int a,b; a=5; a=a+(a++); cout<<a<<endl; a=5; b=a+(a++); cout<<b<<endl; cout<<a<<endl; // 你觉得这行还会输出 5 么 ..? return 0; }
代码解释一切 ...
牧羊人nacy
TA贡献1862条经验 获得超7个赞
自加运算在不同的语言里会有不一样的解释,你在java中就会发现两个都是10,我觉得这个挺误导人的,python、go中都没有这个了,没啥意义。C里面的这个,我觉得可以理解成那个++运算发生在赋值运算之后,而java中发生在赋值运算之前,所以被赋值运算覆盖了。我真的闲的狠,看了一下代码(砍掉无关的,只留下这段计算):
movq %rsi, %rax movl %edi, %ecx movl %ecx, -4(%rbp) movq %rax, -16(%rbp) movl $5, -28(%rbp) movl -28(%rbp), %eax movl -28(%rbp), %ecx addl %ecx, %eax movl %eax, -28(%rbp) movl -28(%rbp), %eax addl $1, %eax movl %eax, -28(%rbp) movl -28(%rbp), %eax xorb %cl, %cl leaq L_.str(%rip), %rdx movq %rdx, %rdi movl %eax, %esi movb %cl, %al callq _printf movl $5, -28(%rbp) movl -28(%rbp), %ecx movl -28(%rbp), %edx addl %edx, %ecx movl %ecx, -32(%rbp) movl -28(%rbp), %ecx addl $1, %ecx movl %ecx, -28(%rbp) movl -32(%rbp), %ecx xorb %dl, %dl leaq L_.str1(%rip), %rdi movl %ecx, %esi movb %dl, %al callq _printf movl $0, -24(%rbp) movl -24(%rbp), %eax movl %eax, -20(%rbp) movl -20(%rbp), %eax addq $32, %rsp popq %rbp ret
第一个算式中加1操作在这里:
movl -28(%rbp), %eax addl $1, %eax movl %eax, -28(%rbp)
从开头就能看到-28(%rbp)
就是变量a的内存位置
第二个算式中加1操作在这里:
movl -28(%rbp), %ecx addl $1, %ecx movl %ecx, -28(%rbp)
而变量b的地址是-32(%rbp)
,当然不会被这个加1操作影响了
添加回答
举报
0/150
提交
取消