寫出經過計算後表示式中a的值。要解釋計算過程

2022-04-04 13:25:45 字數 5568 閱讀 7046

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 過氧化氫在二氧化錳的催化作用下生成水和氧氣,屬於分解反應,文字表示式為 過氧化氫二氧化錳 水 氧氣 分解反應 寫出下...

高斯定理的表示式,高斯定理表示式中各物理量含義

關於高斯定理,最形象化的解釋是 你把每個正點電荷想像成蒲公英的中心點,電場線想像那些毛,不過這時候毛要無限沿長到無窮遠或者中止於另一個 負 的薄公英 對應負電荷 然後每個蒲公英發出的毛的數量與對應的電荷成正比。好了,然後你任意做一個閉曲面看看有什麼結果,如果閉曲面包含的體積中沒有蒲公英,那麼穿進來任...