課程
/后端開發(fā)
/C
/C語言入門
求詳解 ?好暈
2015-03-27
源自:C語言入門 3-8
正在回答
和本站同類型的國外網站。
www.codecademy.com/
課程導航
課程介紹
學習界面
首先要說:a++ = a 和 ++a = a + 1 并不是兩個合法的語句。這兩個式子是說 a++ 的值就是 a 的值,而 ++a 的值等于 a+1。 注意:我說的是++a和a++的值。
你要厘清“運算符”、“表達式”和“語句” 的關系:
++ 是一個“自增運算符”,運算符和操作數(shù)合起來就是一個表達式(a++、++a都是表達式,a就是操作數(shù))。每一個表達式都有值(和其類型)。有的運算符還有“副作用”,比如自增運算符的副作用就是使其操作數(shù)自增1。那么自增運算符的值是什么呢? 就像上一段說的,a++ 的值就是 a 的值,而 ++a 的值等于 a+1。
表達式后面加上一個分號就是一個“語句”。
最后,這兩個自增運算符的副作用(使a增加1)什么時候發(fā)生的呢? 我只能說在“序列點”之后肯定都發(fā)生了。代碼中有的位置被稱為“序列點”,具體哪些位置是序列點有些復雜,簡單地說:“語句結束時”和“邏輯運算符的兩個操作數(shù)之間”都算是序列點。這序列點之前的運算符的副作用,在執(zhí)行到這點以后都保證會發(fā)生。注意并不是在這一點之后就突然發(fā)生的,這些副作用可能在序列點前的任何一個位置發(fā)生,C標準只是規(guī)定在序列點之后這些副作用必須都已經發(fā)生了。
以上是你需要弄明白的,那對于你截圖中的具體問題:
?第一部分 b++ >= a*2 是一個比較表達式,比的是b++和a*2的值。b++的是就是b當時的值,也就是9,所以9大于等于10是假的。而這個表達式又是后面的“邏輯或”表達式的第一個操作數(shù),因為它的結果是假,所以要繼續(xù)判斷第二個操作數(shù)(b-a<=a)的真假。記住邏輯運算符算是序列點,所以在判斷b-a<=a時,b自增1的副作用已經發(fā)生了,b的值就變成10了,那b-a就是5,5小于等于5,為真。所以整個邏輯或表達式的值就是1
第二個截圖中的題本身就有問題?。??原因還是因為序列點,在a+b%a-b/a+a*b-a++這個大復合表達式中,a出現(xiàn)了很多次,就是說需要取a的值很多次,可是其中的一個子表達式a++是有副作用的,而這個a自增1的副作用在什么時候發(fā)生是并不確定的,我只知道在整個語句結束之后a的值肯定是4,但a也可能在取第一個a的值時就已經是4了......也可能第一個a還是3,第二個a就是4了......也可能所有的a都是3......這一切都是有可能的。所以本題完全就錯了??!
最后吐槽下:本站的C教程非常的“業(yè)余”,別再這里浪費時間學C了...
qq_An_myriver_0
redRibbon
onemoo 回復 redRibbon
redRibbon 回復 onemoo
我的學習之旅 提問者
你的這兩個表達式不合法!
在C語言中前置和后置自增運算符返回的結果是右值,不能放在等號左側。
順便提一下:在C++中,前置自增的結果是左值,可以放在等號左側。
http://idcbgp.cn/code/5136?你可以看看這節(jié)中的內容,a++是先取值后運算,++a是先運算后賦值
舉報
C語言入門視頻教程,帶你進入編程世界的必修課-C語言
3 回答還是不懂a=a+1 a=a-1
1 回答(a>3)*a怎么等于1*a去了
4 回答計算順序為什么是1.a+b 2.b%(a+b)/a和a*b 3.a+b%(a+b)/a+a*b-b
2 回答--a||a++和a++||--a為何不同
2 回答a++和a+,+a、++a的區(qū)別是什么??
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-07-21
和本站同類型的國外網站。
www.codecademy.com/
2015-03-28
首先要說:a++ = a 和 ++a = a + 1 并不是兩個合法的語句。這兩個式子是說 a++ 的值就是 a 的值,而 ++a 的值等于 a+1。 注意:我說的是++a和a++的值。
你要厘清“運算符”、“表達式”和“語句” 的關系:
++ 是一個“自增運算符”,運算符和操作數(shù)合起來就是一個表達式(a++、++a都是表達式,a就是操作數(shù))。每一個表達式都有值(和其類型)。有的運算符還有“副作用”,比如自增運算符的副作用就是使其操作數(shù)自增1。那么自增運算符的值是什么呢? 就像上一段說的,a++ 的值就是 a 的值,而 ++a 的值等于 a+1。
表達式后面加上一個分號就是一個“語句”。
最后,這兩個自增運算符的副作用(使a增加1)什么時候發(fā)生的呢? 我只能說在“序列點”之后肯定都發(fā)生了。代碼中有的位置被稱為“序列點”,具體哪些位置是序列點有些復雜,簡單地說:“語句結束時”和“邏輯運算符的兩個操作數(shù)之間”都算是序列點。這序列點之前的運算符的副作用,在執(zhí)行到這點以后都保證會發(fā)生。注意并不是在這一點之后就突然發(fā)生的,這些副作用可能在序列點前的任何一個位置發(fā)生,C標準只是規(guī)定在序列點之后這些副作用必須都已經發(fā)生了。
以上是你需要弄明白的,那對于你截圖中的具體問題:
?第一部分 b++ >= a*2 是一個比較表達式,比的是b++和a*2的值。b++的是就是b當時的值,也就是9,所以9大于等于10是假的。而這個表達式又是后面的“邏輯或”表達式的第一個操作數(shù),因為它的結果是假,所以要繼續(xù)判斷第二個操作數(shù)(b-a<=a)的真假。記住邏輯運算符算是序列點,所以在判斷b-a<=a時,b自增1的副作用已經發(fā)生了,b的值就變成10了,那b-a就是5,5小于等于5,為真。所以整個邏輯或表達式的值就是1
第二個截圖中的題本身就有問題?。??原因還是因為序列點,在a+b%a-b/a+a*b-a++這個大復合表達式中,a出現(xiàn)了很多次,就是說需要取a的值很多次,可是其中的一個子表達式a++是有副作用的,而這個a自增1的副作用在什么時候發(fā)生是并不確定的,我只知道在整個語句結束之后a的值肯定是4,但a也可能在取第一個a的值時就已經是4了......也可能第一個a還是3,第二個a就是4了......也可能所有的a都是3......這一切都是有可能的。所以本題完全就錯了??!
最后吐槽下:本站的C教程非常的“業(yè)余”,別再這里浪費時間學C了...
2015-03-28
你的這兩個表達式不合法!
在C語言中前置和后置自增運算符返回的結果是右值,不能放在等號左側。
順便提一下:在C++中,前置自增的結果是左值,可以放在等號左側。
2015-03-27
http://idcbgp.cn/code/5136?你可以看看這節(jié)中的內容,a++是先取值后運算,++a是先運算后賦值