課程
/后端開發
/C
/C語言入門
a++怎么還是3???
2015-01-30
源自:C語言入門 3-4
正在回答
我不得不再說一遍:這個題是錯的!
你先要明白前置自增運算符和后置自增運算符是怎么回事:
通常說,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的值肯定是4,但a也可能在取第一個a的值時就已經是4了......也可能第一個a還是3,第二個a就是4了......也可能所有的a都是3......這一切都是有可能的,所以這段代碼的行為就是未定義的。
對于寫復合表達式,一般建議:如果表達式改變了一個操作數的值,那就不要在這個復合表達式中再次使用這個操作數。除非你能確定“改變值”和“使用值”的先后順序。?在這個例子中,顯然你不能確定順序。
根據優先級順序,先計算a++,a++命令先算前面的,最后再加一。所以a++結果為3,然后根據優先級順序,先計算b%a=1,b/a=1(整數計算結果只能是整數),a*b=3*4=12,總算式答案為3+1-1+12-3=12,最后在輸出之前,a加一,故a輸出為4,答案輸出為12.
a++的意思是,把先a帶入算式,等到算完所有的之后——,然后再把a拿過來加加,這種類型的題目是初學c語言的易錯點和難點。
殘月沉霜
Q_千年老妖 回復 殘月沉霜
殘月沉霜 回復 Q_千年老妖
a++ 是先取值再計算,++a 是先計算再取值
舉報
C語言入門視頻教程,帶你進入編程世界的必修課-C語言
1 回答(a>3)*a是怎么算出等于1*a的?
5 回答b%(a+b)/a 我怎么算出來是4/3
1 回答(a>3)*a怎么等于1*a去了
1 回答a>3是怎么等于1的?
2 回答a=11,b=(a>3)*a-(a+3)%3
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-08-08
我不得不再說一遍:這個題是錯的!
你先要明白前置自增運算符和后置自增運算符是怎么回事:
通常說,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的值肯定是4,但a也可能在取第一個a的值時就已經是4了......也可能第一個a還是3,第二個a就是4了......也可能所有的a都是3......這一切都是有可能的,所以這段代碼的行為就是未定義的。
對于寫復合表達式,一般建議:如果表達式改變了一個操作數的值,那就不要在這個復合表達式中再次使用這個操作數。除非你能確定“改變值”和“使用值”的先后順序。?在這個例子中,顯然你不能確定順序。
2015-03-05
根據優先級順序,先計算a++,a++命令先算前面的,最后再加一。所以a++結果為3,然后根據優先級順序,先計算b%a=1,b/a=1(整數計算結果只能是整數),a*b=3*4=12,總算式答案為3+1-1+12-3=12,最后在輸出之前,a加一,故a輸出為4,答案輸出為12.
2015-03-05
a++的意思是,把先a帶入算式,等到算完所有的之后——,然后再把a拿過來加加,這種類型的題目是初學c語言的易錯點和難點。
2015-01-30
a++ 是先取值再計算,++a 是先計算再取值