亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

vs2010下輸出11,10.不過導致輸出結果不同的原因是什么?

vs2010下輸出11,10.不過導致輸出結果不同的原因是什么?

心有法竹 2023-05-01 11:07:23
#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;
}

代碼解釋一切 ...

查看完整回答
反對 回復 2023-05-03
?
牧羊人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操作影響了


查看完整回答
反對 回復 2023-05-03
  • 2 回答
  • 0 關注
  • 277 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號