我在學C語言,裡面有一題我沒弄懂,請知道的幫忙解答aaaaa

2022-07-06 17:55:13 字數 5665 閱讀 7090

1樓:檀木妍

這個題裡面(因為沒有兩個相鄰的字首++a),++a以a+1代入,並將a的值更新為a+1,此時第二項即a++裡先用a更新後的值即a+1代入運算,至於字尾++是在整個表示式結束後再進行的。。此時前兩項的和為a+1+a+1=2a+2,變數a的值仍舊是a+1,第三項即++a,先將a從a+1更新成a+2然後代入運算,此時前三項和為2a+2+a+2=3a+4,而變數a的值從a+1更新成了a+2,第四項a++,先用變數a的值a+2代入運算,字尾同樣待到表示式結束後進行,此時前四項和為3a+4+a+2=4a+6,變數a的值仍舊是a+2,第五項++a,先將變數a的值更新成a+3然後代入運算,此時五項和為4a+6+a+3=5a+9,變數a的值被從a+2更新成了a+3,此時因為表示式執行結束,因此再來進行前面沒有進行的兩次字尾++運算,因此最後變數a的值再次從a+3更新成a+3+2=a+5,而表示式的值是5a+9

如果還有不明白可以再交流。。

2樓:匿名使用者

++a說的是表示式和a 都 加1

a++表示式不變。a 加1

3樓:歡樂送

int a=1;(++a)+(a++)+(++a)+(a++)+(++a)=18

4樓:匿名使用者

在c語言中y=(++a)+(++a)+(++a),那麼y的值是多少呢?

5樓:鬼火狼煙

lz,這個題目按照c規範來說的確等於15,但是實際上每個編譯器對規範的支援都不相同,如果lz是應付考試的話,15應該是正確的,因為使用規範上的++解釋來作為考試是絕對天經地義的.處於對樓上幾位xd的尊重,使用事實來說話.我用了3個編譯器測試了一下,結果全部不為15,這個++a和a++的實現,由於棧結構的操作差異,每個編譯器都不相同,我同時比較了vc6.

0 borland c++ build6 redhat 7.0自帶的g++,結果是vc6.0是16,bcb是18,g++是18.

由於我上網的機器是windows,所以g++的實現我沒辦法貼上過來,下面是vc6.0和bcb的實現,大家仔細看一下就知道了,g++的實現我比較了,和bcb是一樣的,詳細的地方我註釋了:

vc6.0:

6: int a =3,y;

00401548 mov dword ptr [ebp-4],3 'a是[ebp-4]

7:8: y=(++a)+(++a)+(++a);

0040154f mov eax,dword ptr [ebp-4]

00401552 add eax,1 '首先a+1值4進eax

00401555 mov dword ptr [ebp-4],eax 將4賦值給a

00401558 mov ecx,dword ptr [ebp-4]

0040155b add ecx,1 '然後a的值4加1為5進ecx

0040155e mov dword ptr [ebp-4],ecx '將5賦值給a

00401561 mov edx,dword ptr [ebp-4] 'edx進5

00401564 add edx,dword ptr [ebp-4] '將edx+a 得10進edx

00401567 mov eax,dword ptr [ebp-4] 'eax進5

0040156a add eax,1 '將eax+1得6進eax,注意,這步是關鍵,vc是先進2運算1步後再進1.

0040156d mov dword ptr [ebp-4],eax 將6賦值給a

00401570 add edx,dword ptr [ebp-4] 將edx+a得16進eax

00401573 mov dword ptr [ebp-8],edx 將edx得值給y

bcb:

unit1.c.11: int a =3,y;

mov [edp-0x04],0x00000003 'a賦值3

unit1.c.13: y=(++a)+(++a)+(++a);

inc dword prt [edp-0x04] 'a值+1為4

inc dword prt [edp-0x04] 'a值+1為5

inc dword prt [edp-0x04] 'a 值+1 為6,注意bcb得操作,先將a連續加3次.和vc有差別

mov eax,[edp-0x04] '將a值6給eax

add eax,[edp-0x04] ' 將eax+a值6得12給eax

add eax,[edp-0x04] '將eax+a值6得18給eax

mov [edp-0x08],eax '將eax值給y

比較可知道:vc得操作更能表示++a是一個表示式得思想(採用獨立暫存器儲存++a得值.不像bcb直接將++a得值存在a中),但是由於棧操作得順序,導致和規範有差異(我想原因應該是微軟比較排斥不是自己開發得規範吧呵呵)

希望我得解釋能給這個永恆得爭論得解決一點幫助,需要提醒lz和樓上各位得是:bcb和g++之所以這麼做,引用原bcb得設計者得話來說,是對效率的尊重,與其為了一個很混淆的++概念的完美實現,不如犧牲一點和規範的不相容來得到高效率,在這一點上,通過上面的**可知,從++的實現,bcb和g++要遠高於vc的效率.所以就和樓上xd所說:

概念只是存在於書本,只有我們使用到了才是有用的,事實才能判斷一切.

6樓:魚尾唯一

我來說一下哦

裡面一共出現3個++a

第一個++a的值是3自+所以是4,此時a的值是4了第二個++a的值就是4自+,所以是5,此時a的值就是5了第三個++a的值就是5自+,所以是6

所以y=4+5+6=15

7樓:守望中的守護

首先明確執行順序,有括號的先執行括號中語句,由於問題中的語句有三個括號,則應該自左向右的順序執行。

++a的意思是在使用a之前把a加1。

現在假設a的初始值為a,根據之前所說的執行順序,先執行左邊第一個括號,結果為a+1,再相繼執行後面兩個括號,注意到a的值已經在上一次運算中發生變化,所以後面兩個括號的結果分別為a+2和a+3,最後將三個括號結果相加,y=3a+6,把a=3代入,結果為15.

但是這只是按照標準c的規則得到的答案,不同的編譯器有不同的解釋方法,所以實際上可能得到不同的結果。

8樓:

編譯器不同,可能會出現不同的結果。

用 ms vc++ 和 linux cc, linux gcc 得 15.00

程式中最好不要用二義性或多義性的語句形式,編譯器不同,可能會出現不同的結果,給自己帶來麻煩。

把 y=(++a)+(++a)+(++a)拆開來,寫明確了多好:

a = 3;

a = a + 1;

y = a + a + a;

-----------------

或:a = 3; b = a + 1; c = b + 1; d = c + 1;

y = b + c + d;

語句是為人服務的,程式設計師要做語句的主人。

書是人寫的,書上錯的東西有的是。書為我而用,取其精華,去其糟粕。

9樓:匿名使用者

不同的編譯器可以得到不同的結果。因為不同的編譯器它們運算的順序是不一樣的。所以這種問題要具體問題具體對待拉

10樓:匿名使用者

正確答案是15我是問的我的大學老師啊!!!

是絕對對的@@

就是=是從右往左算的一個一個自增1的

6+5+4=15

我的回答也許不是很詳細能幫助你是我高興的事!!

11樓:

編一個自己試一下

ps:討論這個沒有什麼意義,讓別人看你**的時候也要想上半天,語言是讓人看懂的,不是讓人感到困惑的

12樓:

15「=」是自右向左運算

(++a)+(++a)+(++a)

6 + 5 + 4 =15

13樓:匿名使用者

是15,自右向左計算!15 =6 + 5 + 4

14樓:

y=4+5+6=15

15樓:

不同的編譯器會出現不同的結果.全是對的

16樓:

研究這些有什麼意義呢?

17樓:

用編譯器試下吧,我覺得應該是15

c語言解答 a+=a-=a*a ???/ 請高手解決 謝謝~·

18樓:

a+=(a-=(a*a))

說明:1.首先a*a,假設b=a*a

2.a-=b,那麼a=a-b,也就是a=a-a*a,此時a的值已經改變,設c=a-a*a

3.c+=c,也就是c=c+c=2c=2*(a-a*a)所以可知,那個等式為a=2*(a-a*a)

19樓:

一般的編譯器處理順序賦值的結果應為 2(a-a*a)自己寫**最好不這麼幹,以防你的編譯器有個性。

看別人的**犯暈的話,也許debug一下比較輕鬆。

計算機語言這玩意語法說了不算,計算機說的才是硬道理。

20樓:匿名使用者

這裡就涉及到一個優先順序的問題,

=為賦值語句,賦值是從後面往前面進行的

再一個就是三目運算,例如x+=y可以改寫成x=x+y按照這個規律進行計算,一步一步進行,首先是a*a,再算a-=a*a,這樣a被賦值為a-a*a,接著繼續算,a被賦值為a+a*a+a-a*a=2(a-a*a)

迴圈巢狀的執行順序是什麼?先執行外迴圈還是內迴圈?新手剛學c語言不懂,請大神幫忙解答~for(a=

21樓:潮範君

1.外層判斷迴圈條件,滿足進入外層迴圈體

2.內層判斷迴圈條件

3.內層迴圈體執行

4.內層迴圈變數累加,回到2執行,直到不滿足內層條件5。外層迴圈變數累加,回到1執行,直到不滿足外層迴圈條件,徹底退出迴圈

22樓:

c語言是順序處理的,當然先外層,a=1->判斷a是否<=100->小於100則執行,否則退出迴圈,執行完語句塊再a++。再判斷a是否<=100->小於100則執行,否則退出迴圈。。。。

23樓:匿名使用者

for(a=1;a<=100;a++)

}這樣叫做迴圈巢狀,每執行外迴圈一次,要等待內迴圈全部完成或中止,才繼續接著外迴圈,如此反覆,直到外迴圈完成.

c語言題,a+=a-=a+a 這個怎麼算?

24樓:匿名使用者

從右往左依次計算

先計算a-=a+a得到a=a-(a+a)=-a

再計算a+=a得到a=a+a=-2*a(這個a是初始的a)

請幫我看一下我的玉鐲的價值,裡面有一些白色和黑色的小顆粒

現在假貨太多,如果價值高就找人專門看一下,如果同市我可以幫你看一下。我煙臺 請懂行的朋友幫我鑑定下這個玉鐲的價值,我 照的這個部位用裡面有塊明顯的白色,能不能看出來是什麼,這塊翡翠瑕疵太多,嚴重影響 1000左右!請專家幫我看看這個玉鐲現在的價值,感謝萬分!豆青種飄綠鐲子.底子灰了些,綠色不夠陽,水...

請懂的人看一下我的玉里面有道裂紋,但是外面一點沒有,一直在身上沒有碰也沒有摔。不知道正常嗎

翡翠,也就是玉,是在幾百萬年前,由兩塊大陸碰撞下,產生的超高壓力下形成的,所以,玉石在內部有一些壓力作用形成的內裂,是很正常的,不出露於表面的話,對玉石的耐久性影響不大。不過,對於玉本身的價值,那是肯定有影響的,一般在20 30 嚴重的影響超過50 當然影響價值啦,一下使好玉掉幾個檔次 十玉九裂 種...

一首歌女生唱的我只記得歌詞裡面有幾句沒什

綠洲作詞 徐佳瑩 bai葛大為 作曲du 徐佳瑩 演唱zhi 徐佳瑩 我會唾棄 自己的寬dao容 情願放逐版每條背叛的線索 你的沉著 喧鬧得權震耳欲聾 嘲笑我 永遠的詞窮 我會慶祝 自己的墮落 放任愛情惡性迴圈的作弄 你的溫柔 埋藏甜蜜的陰謀 慫恿我 做困獸之鬥 你能往前走 我也厭倦了再蹉跎 緊抱住...