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

為了賬號安全,請及時綁定郵箱和手機立即綁定

int a = 3; b = 4;計算a+b%a-b/a+a*b-a++該算式的運算結果以及運算后a的值如果題目改成int a = 3; b = 4;計算a+b%a-b/a+a*b-(++a)答案是多少???

int a = 3; b = 4;計算a+b%a-b/a+a*b-a++該算式的運算結果以及運算后a的值如果題目改成int a = 3; b = 4;計算a+b%a-b/a+a*b-(++a)答案是多少???

正在回答

2 回答

沒有答案, a+b%a-b/a+a*b-a++ 這個式子本身就是錯的。

你先要明白前置自增運算符和后置自增運算符是怎么回事:

通常說,a++是先取值后運算,++a是先運算后取值。實際上這里涉及“運算符”、“表達式”和“語句”的概念。

++ 是一個“自增運算符”,自增運算符有兩種形式:前綴自增(++a)和后綴自增(a++)。

運算符和操作數合起來就是一個表達式(a++、++a都是表達式,a就是操作數)。注意:每一個表達式本身都有值(和其類型),有的表達式還有“副作用”。比如自增表達式的副作用就是使其操作數自增1。那么自增運算表達式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。?

表達式后面加上一個分號才是一個完整的“語句”。

還有一個關鍵內容:前面說使操作數自增1是自增表達式的副作用,那么這個副作用什么時候發生呢? 準確地說是在“序列點”后保證會發生。 序列點這個概念比較復雜,簡單地說:“語句結束時”是一個序列點。這序列點之前的運算符的副作用,在執行到這點以后都保證會發生。注意并不是在這一點之后就突然發生的,這些副作用可能在序列點前的任何一個位置發生,C標準只是規定在序列點之后這些副作用必須都已經發生了。

在a+b%a-b/a+a*b-a++這個大復合表達式中,最后有一個a++,這個子表達式的值是3沒有錯(因為是先求值再自增),但在整個表達式中a還出現了很多次,就是說需要取a的值很多次,可是最后這個子表達式a++的副作用在什么時候發生是并不確定的。我只知道在整個語句結束之后a的值肯定是4,但a也可能在取第一個a的值時就已經是4了......也可能第一個a還是3,第二個a就是4了......也可能所有的a都是3......這一切都是有可能的。所以也許這段代碼在我這里編譯出的結果就和你的不一樣。


對于寫復合表達式,一般建議:如果表達式改變了一個操作數的值,那就不要在這個復合表達式中再次使用這個操作數。除非你能確定“改變值”和“使用值”的先后順序。?在這個例子中,顯然你不能確定順序。

4 回復 有任何疑惑可以回復我~
#1

夢穎千年 提問者

這個前面一個是慕課網出的題目啊,是前面一個沒答案還是后面一個沒答案啊
2015-07-24 回復 有任何疑惑可以回復我~
#2

夢穎千年 提問者

#include <stdio.h> int main() { int a = 3; int b = 4; printf( "y=%d\n",a+b%a-b/a+a*b- a ++); printf( "a=%d\n",a); return 0; } //我這么寫代碼對嗎
2015-07-24 回復 有任何疑惑可以回復我~
#3

夢穎千年 提問者

非常感謝!
2015-07-25 回復 有任何疑惑可以回復我~
#4

onemoo 回復 夢穎千年 提問者

解釋中的意思是:兩個都沒有答案。 可能你沒有看懂解釋。
2015-07-26 回復 有任何疑惑可以回復我~
#5

王彧喧

你的意思是a++或++a使得a值變化的時間點不確定(這又是由于式子中出現了多個a),所以答案不確定對吧。這是標準中沒有明確規定的,可能在TC,VC,C4droid等不同編譯器上不同結果等情況。
2015-08-25 回復 有任何疑惑可以回復我~
#6

onemoo 回復 王彧喧

是的,因為C并沒有規定操作數的求值順序,加上序列點導致的不確定性,整個表達式的行為就是未定義的了。
2015-08-25 回復 有任何疑惑可以回復我~
查看3條回復

#include <stdio.h>

int main()

{

? ? int a = 3;

? ? int b = 4;

? ? printf( "y=%d\n",a+b%a-b/a+a*b- a ++);

? ? printf( "a=%d\n",a);

? ? return 0;

}

0 回復 有任何疑惑可以回復我~
#1

onemoo

a+b%a-b/a+a*b- a ++ 寫這樣的表達式本身就不對
2015-07-26 回復 有任何疑惑可以回復我~
#2

夢穎千年 提問者 回復 onemoo

錯了嗎?這個應該怎么寫的啊
2015-07-27 回復 有任何疑惑可以回復我~
#3

onemoo 回復 夢穎千年 提問者

請再看一遍我前面的解答。 如果看不懂,請明確指出是哪里不明白。
2015-07-29 回復 有任何疑惑可以回復我~
#4

小玖so 回復 onemoo

大神,指教一下,我看到這個問題明白你的意思,但是這個題目中的表達式就是這樣寫的,我把這個表達式放進去也能運行,能正確的出來值,這是為什么?
2015-08-04 回復 有任何疑惑可以回復我~
#5

onemoo 回復 小玖so

你看,我說這樣寫是錯的,沒有說這樣寫不合法。這個代碼是可以編譯通過的,也能運行,但有結果并不能說明這是“正確的”,而且這個結果也不能說是“正確”的值。 正如我前面解答中所說“...但a也可能在取第一個a的值時就已經是4了......也可能第一個a還是3,第二個a就是4了......也可能所有的a都是3......這一切都是有可能的...”,這種不確定性就是C標準中的“未定義”行為,你無法保證這個代碼在所有的平臺上都得出同樣的結果,這種連結果都不確定的代碼能說是正確的嗎?
2015-08-04 回復 有任何疑惑可以回復我~
#6

小玖so 回復 onemoo

明白了,謝謝!
2015-08-05 回復 有任何疑惑可以回復我~
查看3條回復

舉報

0/150
提交
取消

int a = 3; b = 4;計算a+b%a-b/a+a*b-a++該算式的運算結果以及運算后a的值如果題目改成int a = 3; b = 4;計算a+b%a-b/a+a*b-(++a)答案是多少???

我要回答 關注問題
微信客服

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

幫助反饋 APP下載

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

公眾號

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