#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
提交
取消