1樓:
(a)a += (a++)等價於
a=a+(a++)
=4+4
=8再執行a++,a=9
(b)a += (++a)等價於
a=a+(++a)
=5+5
=10(c)
(++a) += (a++)等價於
++a=++a+a++
=5+5
=10再執行a++,a=11
2樓:
a.a+=(a++),先取a的值4,然後a+1=5,相加後=9
b,a先+1=5,然後5+5=10
c,後面的a先取值4,然後加1得到5,此時a=5,前面的a+1=6,5+6=11
3樓:匿名使用者
(a) a = a+(a++) 先運算後自增, 相當於a=4+4; a++; 最後a=9
(b) a = a+(++a) 先自增後運算,相當於a++; a = 5 + 5;最後a=10
(c) (++a) = (++a) + (a++) 在gcc下會報錯。具體分析如下。
針對4樓討論的關於前置++和後置++返回左右值的問題。
1.前置++的實現是將原有的a的地址上的值增加1,然後返回該a的地址。也就是說,a原先的值已經不存在了。
但從返回a的地址這點上來說,有些編譯器(如4樓提到的vc6.0)可能容許它作為左值。但從gcc下編譯無法通過來看,強烈不推薦這種冒險的做法。
2.後置++的實現是將a拷貝一份,放在區域性變數tmp裡面,將a自增1,返回tmp。也就是說,你在表示式裡見到的將是a原來值的最後一面(返回值在返回後,將從堆疊中移除)。
這就是為什麼 int a=4,b=0; b=a++;b的值是4而不是5的原因。當然,無論是什麼編譯器都不可能容許一個返回的區域性變數tmp的記憶體地址作為左值了。
希望對lz能有幫助。
4樓:匿名使用者
其實說實話,最後一個表示式根本不具有實用性,而且其很有可能在不同的編譯器下有著不同的解釋,從而執行出不同的結果,極其不推薦樓主使用這種寫法,當然如果你想知道清楚,那希望你有耐心看我我的東西。。。
首先給出我的測試結果:
測試**:
# include
void main()
測試結果:
a=9;e=9
b=10;d=10
c=11;f=13
h=14;j=12
g=12
注:以上結果基於vc6.0編譯器。
下面首先針對樓上幾位的回答提下細節問題:
1樓寫道:
(++a) += (a++)等價於
++a=++a+a++
根據測試結果:
(++c)+=(c++) 為11
(++f)=(++f)+(f++)為13
可知兩者其實並不等價,從而1樓對第3式的解釋是不準確的,而且其對11這個結果的得出也是很牽強的,這個就不細究了。
2樓得解釋就不說了,不太有邏輯~~~
3樓說: (++a) = (++a) + (a++) 會報錯。因為++的實現是返回一個右值(也就是不可以放在等號左邊的值)。
事實證明表示式 (++a) = (++a) + (a++) 可以通過編譯,其說法:因為++的實現是返回一個右值是沒有錯的,但是看的不夠深入~
下面我提出我的基本觀點:
前置自增運算子在一個表示式中其優先順序是很高的,一般情形下,在一個算術運算表示式中其具有最高優先順序,若一個算式表示式f(++a1,++a2,++...,++an)中含有n個前置自增運算子,則此表示式的求解過程等價於:
++a1;
++a2;
++a3;
........
++an;
f(a1,a2,a3,...,an);//注意表示式的變化:f(++a1,++a2,++...,++an) 變為 f(a1,a2,a3,...,an)
下面討論含有後置自增運算子時的情形,後置自增作用的變數是先用後增,從而若有一個算式表示式f(b1++,b2++,...++,bn++)中含有n個後置自增運算子,則此表示式的求解過程等價於:
f(b1,b2,b3,...,bn);
b1++;
b2++;
b3++;
........
bn++;
進一步拓展為:
若一個算式表示式f(++a1,++a2,++...,++an,b1++,b2++,...++,bn++)中含有n個前置自增運算子,和含有n個後置自增運算子,則此表示式的求解過程等價於:
++a1;
++a2;
++a3;
........
++an;
f(a1,a2,a3,...,an,b1,b2,b3,...bn);
b1++;
b2++;
b3++;
........
bn++;
下面舉例證明:
1 :(++a) += (a++) 等價於:
++a;為5
a+=a;所以a=10
a++;為11
2: (++f)=(++f)+(f++)等價於:
++f;為5
++f;為6
f=f+f;為12
f++;為13
其他各式都可如此證明,至此,證畢!
下面針對3樓所說的問題進行初步討論:
在表示式f(++a1,++a2,++...,++an,b1++,b2++,...++,bn++)中,並不是所有的情形都是能夠通過編譯的,那就是:
在運算子=或+=等等,運算子的左邊的單變數只能含有前置自增運算子,不能為帶後置自增運算子的單變數,即是說:
(++f)=(++f)+(f++);是合法的(基於vc6.0,其他編譯器我不知道,待定。同時可以說明表示式中的此類括號的存在與否在vc6.
0中是沒有影響的,這個也因編譯器而定。以後不再特別說明)
而(f++)=(++f)+(f++);是非法的!!!
這個的具體機理我不知道,但是初步猜測為:
在左側為前置自增運算子時,其自增計算在表示式的計算之前完成了,從而在計算表示式的值時此時左側已經成為了單值變數,而不再是表示式,但是當左側為後置自增運算子時,其在計算表示式的值時自增運算還沒有進行,左側為表示式,從而語法錯誤。
基於以上討論,第三個表示式的使用是極力不推薦的!!!
下面給出能夠通過編譯的此類表達通式的計算等價形式:
表示式:++value+=f(++a1,++a2,++...,++an,b1++,b2++,...++,bn++)的等價計算為:
++value;
++a1;
++a2;
++a3;
........
++an;
value=value+f(a1,a2,a3,...,an,b1,b2,b3,...bn);
b1++;
b2++;
b3++;
........
bn++;
至此,完畢,謝謝閱讀~~~
c語言題目,寫出下列表示式的值,並寫出運算過程。設a=10,b=4。 a+b,18+(b=4)*3
5樓:吾還在
a+b=14
2.4*3=12
12+18=30
3.是一個右值表示式,結果為右邊的值
即 a % b 的值,%求餘運算子 故結果為2
6樓:end丶
1.a+b=14
2.4*3=12
12+18=30
3.不明所以
c語言 設a=14則經過表示式「a+=a-=a*=a」後a的值為 答案是0 求解釋 怎麼算出來的?
7樓:魯濱遜_克羅索
(1)計算a*=a,即a=a*a;所以a的值為198;
(2)計算a-=a(此時表示式化為a+=a-=a),即a=a-a,所以a得值為0;
(3)計算a+=a(此時的表示式就是他了),即a=a+a,所以a的值為0
(4)計算完了,a=0
8樓:匿名使用者
這個式子從右向左計算,相當於
依次a=a*a;
a=a-a;
a=a+a;
所以最終是0。
9樓:丶元芳
首先要明白運算子優先順序的概念,『+=「,「--=』,『*=』這些優先順序都是相同的所以直接從左至右讀;
a+=a得到a變為28;
a-=a得到a變為0;
a*=a得到a還是0;
所以答案為0;
賦值表示式:a+=a-=a*=a; 設a=12,請問它的計算過程是什麼?
10樓:匿名使用者
a += a -= a *= a;
這是一個賦值表示式它包含複合的賦值運算子;由於賦值運算子結合方向是 \"自由至左\" 因為a的初值為12,此賦值表示式的求解步驟如下:
s1:先進行\"a *= a\"的運算,它相當於a = a * a,a的值為12*12=144;
s2:再進行\"a -= 144\"的運算,相當於a = a - 144,a的值為144-144=0;
s3:最後進行\"a += 0\"的運算,相當於a = a + 0, a的值為0+0=0;
所以此表示式結果為0
11樓:讓赫蒯和煦
先要考慮結合性問題
這時自右至左的
所以先做a*=a得144
,然後做a-=a就是a=a-a
也就是144-144=0
最後是做a+=a就是0+0=0最後結果就是得0啦
12樓:匿名使用者
這個是沒有技術含量的,但是作為考察基礎知識是有那麼一點點用的的
13樓:匿名使用者
暈死,是個人都不會寫出這種程式來的。
a += a -= a *= a;
相當於a += (a -= (a *= a));
因為 a 的值為 12,所以 a *= a 後,a = 24a -= 24 後,a = 0
a += 0 後,a = 0
14樓:檢綠凝
流汗.a=12 a*=a後是24嗎?應該是a=a*a=12*12=144
然後a=a-a=144-144=0
最後結果是0
若a是int型變數,且a的初值為5,則計算a+=a-=a*a,表示式後a的值為:
15樓:匿名使用者
a=-40
因為+=和-=優先順序一樣,結合方向為右到左,所以a+=a-=a*a等價於a+=(a-=(a*a))即a=a-a*a=5-5*5=-20
a=a+a=-20-20=-40
16樓:匿名使用者
感覺是-40吧,先運算a*a=25(注意:此時a的值並未變化),第二步算a-=25,即a=a-25,a=-20,再運算a+=a(此時a=-20),所以結果是-40。
17樓:匿名使用者
-40原來字數少回答不了。。。
經過以下語句定義後,表示式zxyxy的值是
結果是來6 z x y?x y的意思是 z z x y?x y 因為x y為假,所以x y?x y這個運自算出來是bai y,那麼式子就成了 z z y 而 運算子是du先自增然後才執行zhi下一條語句dao,那麼y就先辦成3,然後才會和z相加的 這樣就計算出來了z 3 3 給你改編一下應該好理解i...
寫出下列變化的文字表示式或化學符號表示式,並註明反應型別(化
抄1 硫在空氣中燃燒生襲成二氧化硫,屬於化合反應,文字表示式為 硫 氧氣點燃 二氧化硫 化合反應 2 電解水生成氫氣和氧氣,屬於分解反應,文字表示式為 水通電氫氣 氧氣 分解反應 3 過氧化氫在二氧化錳的催化作用下生成水和氧氣,屬於分解反應,文字表示式為 過氧化氫二氧化錳 水 氧氣 分解反應 寫出下...
高斯定理的表示式,高斯定理表示式中各物理量含義
關於高斯定理,最形象化的解釋是 你把每個正點電荷想像成蒲公英的中心點,電場線想像那些毛,不過這時候毛要無限沿長到無窮遠或者中止於另一個 負 的薄公英 對應負電荷 然後每個蒲公英發出的毛的數量與對應的電荷成正比。好了,然後你任意做一個閉曲面看看有什麼結果,如果閉曲面包含的體積中沒有蒲公英,那麼穿進來任...