1樓:鬼火狼煙
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所說:
概念只是存在於書本,只有我們使用到了才是有用的,事實才能判斷一切.
2樓:魚尾唯一
我來說一下哦
裡面一共出現3個++a
第一個++a的值是3自+所以是4,此時a的值是4了第二個++a的值就是4自+,所以是5,此時a的值就是5了第三個++a的值就是5自+,所以是6
所以y=4+5+6=15
3樓:守望中的守護
首先明確執行順序,有括號的先執行括號中語句,由於問題中的語句有三個括號,則應該自左向右的順序執行。
++a的意思是在使用a之前把a加1。
現在假設a的初始值為a,根據之前所說的執行順序,先執行左邊第一個括號,結果為a+1,再相繼執行後面兩個括號,注意到a的值已經在上一次運算中發生變化,所以後面兩個括號的結果分別為a+2和a+3,最後將三個括號結果相加,y=3a+6,把a=3代入,結果為15.
但是這只是按照標準c的規則得到的答案,不同的編譯器有不同的解釋方法,所以實際上可能得到不同的結果。
4樓:
編譯器不同,可能會出現不同的結果。
用 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;
語句是為人服務的,程式設計師要做語句的主人。
書是人寫的,書上錯的東西有的是。書為我而用,取其精華,去其糟粕。
5樓:匿名使用者
不同的編譯器可以得到不同的結果。因為不同的編譯器它們運算的順序是不一樣的。所以這種問題要具體問題具體對待拉
6樓:匿名使用者
正確答案是15我是問的我的大學老師啊!!!
是絕對對的@@
就是=是從右往左算的一個一個自增1的
6+5+4=15
我的回答也許不是很詳細能幫助你是我高興的事!!
7樓:
編一個自己試一下
ps:討論這個沒有什麼意義,讓別人看你**的時候也要想上半天,語言是讓人看懂的,不是讓人感到困惑的
8樓:
15「=」是自右向左運算
(++a)+(++a)+(++a)
6 + 5 + 4 =15
9樓:匿名使用者
是15,自右向左計算!15 =6 + 5 + 4
10樓:
y=4+5+6=15
11樓:
不同的編譯器會出現不同的結果.全是對的
12樓:
研究這些有什麼意義呢?
13樓:
用編譯器試下吧,我覺得應該是15
b=(++a)+(++a)+(++a)怎麼運算
14樓:飯盒與玫瑰
3a+6,第一個括,++a過後a=a+1,第二個括號之後a=a+1+1,第三個括號之後a=a+1+1+1,所以b=3a+6
15樓:紫舞玥汐
舉例子說,設a=0
分解式子b=x+y+z
從左到右計算,其中x=++a,先算++a,得到x=1,a=1然後計算第二個++a時,得到y=2,a=2最後第三個++a,得到z=3,a=3
最後將x+y+z =6,得到b的值
16樓:匿名使用者
這種問題出現過很多次了,要說b=(++a)+(++a)+(++a)怎麼運算?那是取決於編譯程式的。因為c語言標準沒有明確的規定,其結果是未定義(undefined)。
可以放在程式裡去執行看。
假如a的初值是1,用vc編譯運算的結果 b=12,而用gcc編譯則 b=10。結果與上面的分析沒有相同的。
int main()
所以說這種**沒有意義。
17樓:
括號的優先順序最高,先算括號,從左自右;++a是先+1再運算,所以該式子相當於:
b=(a+1)+((a+1)+1)+(((a+1)+1)+1)
18樓:匿名使用者
假如說a=1,那麼++a之後,a就是2,依次類推,因此:
b=(2)+(++a)+(++a)=>
b=(2)+(3)+(++a)=>
b=(2)+(3)+(4)=>
b=2+3+4=>
b=9;
19樓:木子靈脩
b=a+1+a+2+a+3=3a+6
20樓:官人有話說
回答您好,很高興為您解答,具體運算如下哦:
int main()
希望我的解答對您有所幫助
提問已知a=[1,2,3;4,5,0;7,8,9];b=[1,0,3;1,5,0;0,1,2]
怎麼算出來
a==bans=___
回答稍等哈
更多12條
c語言中計算機如何處理(++a)+(a++)的,當a=10那麼式的值是多少?
21樓:匿名使用者
你寫個輸出函式試試就行,是22
#include
int main()
22樓:
不同的編譯器處理的方式不一樣,儘量避免這種寫法
23樓:匿名使用者
那個qq數字使用者說的是對的~這個屬於未定義行為,主要由編譯器實現。
24樓:
c語言中無法識別帶+號的變數
a=1,a=2(a++)+(++a)等於多少c語言
25樓:獅子龍翔
4 執行**如下。。。有用請採納,伸手黨請點贊
26樓:明柯答疑
回答同學你好,化簡結果為:3(a+1)
這道題分別把實數相加和未知數相加,最後結合提出3即可。
提問謝謝
更多2條
c語言正確的賦值是哪一個:y++;++y;a=3,b=3;a=b=2;a=b==3;在這幾項賦值時都有什麼要求?
27樓:匿名使用者
y++;++y; // 這是自增運算
a=3,b=3;// 這是賦值
a=b=2; //這也是賦值,操作的結果是a和b的值都為2a=b==3; // 這也是賦值,如果b的值是3,則a = 1,否則a = 0
28樓:匿名使用者
不明白你說的意思!y++;++y;a=3,b=3;這3項都是沒有問題的,但是a=b=2;a=b==3;要看是什麼情況下了,如果是在這語句之前都已經定義了a、b就沒什麼問題,如果是在定義的同時這樣賦值就是錯誤的,至於有什麼要求,沒什麼具體的要求,這都是基本的用法,只要基礎知識掌握了一般都沒問題的!解釋一下就是:
1.y++是先使用y然後自身加1,;
2.++y是y先自身加1然後再使用y;
3.a=3,b=3;就不用解釋了是基本的賦值。
4.a=b=2如果是在定義時這樣:int a=b=2;就會顯示b未定義,很明顯不能這樣;如果是這樣int a,b;
a=b=2;這樣就沒任何問題了;
5.a=b==3如果在定義時這樣:int a=b==3;同4也是錯誤的;如果這樣:
int a,b;a=b==3;表示的是先判斷b是否為3,如果b等於3,則把1賦值給a,如果b不等於3,把0賦值給a,而b自身的值不變;
合法不合法我上面都說了,要看是在什麼情況下,如果都是已經定義了的int變數,那麼就是合法的。
在c語言中其值是多少,1033在C語言中其值是多少
結果是 1.0 這裡的運算全部按照浮點來進行的,等價於1.0 3.0 3.0 不可能是1 輸出是什麼格式 d 為0 f為 1 d為0 f lf和 g為1 c語言中表示式1.0 3 3的值是 對呀,確實是這樣的 因為浮點數的精度是這個1.0是浮點數,精度是小數點後6位。所以1.0 3是0.333333...
C語言中42的值為1困惑,C語言中402的值為1困惑
首先 和 的有限級別是相同的 4 0 同時為真才是真所以為 他的值為 0然後0 2 因為 是隻要一個為真就為真 所以最後結果為1 邏輯運算子的運算優先順序是 所以先算4 0,因為4為非0,即為真,但這並能表明整個4 0就是真,還要判斷後面的0,為假,所以整個表示式4 0就為假,值為0,然後再算0 2...
pa在C語言中的意思,c語言中pa是啥子意思
a是一個指標 把指標a所指向的內容賦值p a為指標 a表示指標地址的內容 p a 把指標內容賦值給p 將a指向的變數的值賦給p c語言中p a是啥子意思 p 是一個結構體或者共用體型別資料的指標。p a表示訪問該指標上,名為a的資料成員。等效於 p a p是一個結構體型別的指標變數,這個結構體中有一...