課程
/后端開(kāi)發(fā)
/C
/C語(yǔ)言入門
a++怎么還是3???
2015-01-30
源自:C語(yǔ)言入門 3-4
正在回答
我不得不再說(shuō)一遍:這個(gè)題是錯(cuò)的!
你先要明白前置自增運(yùn)算符和后置自增運(yùn)算符是怎么回事:
通常說(shuō),a++是先取值后運(yùn)算,++a是先運(yùn)算后取值。實(shí)際上這里涉及“運(yùn)算符”、“表達(dá)式”和“語(yǔ)句”的概念。
++ 是一個(gè)“自增運(yùn)算符”,自增運(yùn)算符有兩種形式:前置自增(++a)和后置自增(a++)。
運(yùn)算符和操作數(shù)合起來(lái)就是一個(gè)表達(dá)式(a++、++a都是表達(dá)式,a就是操作數(shù))。注意:每一個(gè)表達(dá)式本身都有值(和其類型),有的表達(dá)式還有“副作用”。比如自增表達(dá)式的副作用就是使其操作數(shù)自增1。那么自增運(yùn)算表達(dá)式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。?
表達(dá)式后面加上一個(gè)分號(hào)才是一個(gè)完整的“語(yǔ)句”。
還有一個(gè)關(guān)鍵內(nèi)容:前面說(shuō)使操作數(shù)自增1是自增表達(dá)式的副作用,那么這個(gè)副作用什么時(shí)候發(fā)生呢? 準(zhǔn)確地說(shuō)是在“序列點(diǎn)”后保證會(huì)發(fā)生。 序列點(diǎn)這個(gè)概念比較復(fù)雜,簡(jiǎn)單地說(shuō):“語(yǔ)句結(jié)束時(shí)”是一個(gè)序列點(diǎn)。這序列點(diǎn)之前的運(yùn)算符的副作用,在執(zhí)行到這點(diǎn)以后都保證會(huì)發(fā)生。注意并不是在這一點(diǎn)之后就突然發(fā)生的,這些副作用可能在序列點(diǎn)前的任何一個(gè)位置發(fā)生,C標(biāo)準(zhǔn)只是規(guī)定在序列點(diǎn)之后這些副作用必須已經(jīng)發(fā)生了。
復(fù)合表達(dá)式中的運(yùn)算順序是由運(yùn)算符優(yōu)先級(jí)決定的,但參與運(yùn)算的操作數(shù)的求值順序是未定的。
在a+b%a-b/a+a*b-a++這個(gè)大復(fù)合表達(dá)式中,根據(jù)運(yùn)算符優(yōu)先級(jí),a++先算,這個(gè)子表達(dá)式的值是3沒(méi)有錯(cuò)(因?yàn)槭窍惹笾翟僮栽觯玜++的副作用在什么時(shí)候發(fā)生是并不確定的,且其他的a是什么時(shí)候取值也是不確定的。我只知道在整個(gè)語(yǔ)句結(jié)束之后a的值肯定是4,但a也可能在取第一個(gè)a的值時(shí)就已經(jīng)是4了......也可能第一個(gè)a還是3,第二個(gè)a就是4了......也可能所有的a都是3......這一切都是有可能的,所以這段代碼的行為就是未定義的。
對(duì)于寫(xiě)復(fù)合表達(dá)式,一般建議:如果表達(dá)式改變了一個(gè)操作數(shù)的值,那就不要在這個(gè)復(fù)合表達(dá)式中再次使用這個(gè)操作數(shù)。除非你能確定“改變值”和“使用值”的先后順序。?在這個(gè)例子中,顯然你不能確定順序。
根據(jù)優(yōu)先級(jí)順序,先計(jì)算a++,a++命令先算前面的,最后再加一。所以a++結(jié)果為3,然后根據(jù)優(yōu)先級(jí)順序,先計(jì)算b%a=1,b/a=1(整數(shù)計(jì)算結(jié)果只能是整數(shù)),a*b=3*4=12,總算式答案為3+1-1+12-3=12,最后在輸出之前,a加一,故a輸出為4,答案輸出為12.
a++的意思是,把先a帶入算式,等到算完所有的之后——,然后再把a(bǔ)拿過(guò)來(lái)加加,這種類型的題目是初學(xué)c語(yǔ)言的易錯(cuò)點(diǎn)和難點(diǎn)。
殘?jiān)鲁了?/a>
Q_千年老妖 回復(fù) 殘?jiān)鲁了?
殘?jiān)鲁了?/a> 回復(fù) Q_千年老妖
a++ 是先取值再計(jì)算,++a 是先計(jì)算再取值
舉報(bào)
C語(yǔ)言入門視頻教程,帶你進(jìn)入編程世界的必修課-C語(yǔ)言
1 回答(a>3)*a是怎么算出等于1*a的?
5 回答b%(a+b)/a 我怎么算出來(lái)是4/3
1 回答(a>3)*a怎么等于1*a去了
1 回答a>3是怎么等于1的?
2 回答a>3怎么運(yùn)算
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2015-08-08
我不得不再說(shuō)一遍:這個(gè)題是錯(cuò)的!
你先要明白前置自增運(yùn)算符和后置自增運(yùn)算符是怎么回事:
通常說(shuō),a++是先取值后運(yùn)算,++a是先運(yùn)算后取值。實(shí)際上這里涉及“運(yùn)算符”、“表達(dá)式”和“語(yǔ)句”的概念。
++ 是一個(gè)“自增運(yùn)算符”,自增運(yùn)算符有兩種形式:前置自增(++a)和后置自增(a++)。
運(yùn)算符和操作數(shù)合起來(lái)就是一個(gè)表達(dá)式(a++、++a都是表達(dá)式,a就是操作數(shù))。注意:每一個(gè)表達(dá)式本身都有值(和其類型),有的表達(dá)式還有“副作用”。比如自增表達(dá)式的副作用就是使其操作數(shù)自增1。那么自增運(yùn)算表達(dá)式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。?
表達(dá)式后面加上一個(gè)分號(hào)才是一個(gè)完整的“語(yǔ)句”。
還有一個(gè)關(guān)鍵內(nèi)容:前面說(shuō)使操作數(shù)自增1是自增表達(dá)式的副作用,那么這個(gè)副作用什么時(shí)候發(fā)生呢? 準(zhǔn)確地說(shuō)是在“序列點(diǎn)”后保證會(huì)發(fā)生。 序列點(diǎn)這個(gè)概念比較復(fù)雜,簡(jiǎn)單地說(shuō):“語(yǔ)句結(jié)束時(shí)”是一個(gè)序列點(diǎn)。這序列點(diǎn)之前的運(yùn)算符的副作用,在執(zhí)行到這點(diǎn)以后都保證會(huì)發(fā)生。注意并不是在這一點(diǎn)之后就突然發(fā)生的,這些副作用可能在序列點(diǎn)前的任何一個(gè)位置發(fā)生,C標(biāo)準(zhǔn)只是規(guī)定在序列點(diǎn)之后這些副作用必須已經(jīng)發(fā)生了。
復(fù)合表達(dá)式中的運(yùn)算順序是由運(yùn)算符優(yōu)先級(jí)決定的,但參與運(yùn)算的操作數(shù)的求值順序是未定的。
在a+b%a-b/a+a*b-a++這個(gè)大復(fù)合表達(dá)式中,根據(jù)運(yùn)算符優(yōu)先級(jí),a++先算,這個(gè)子表達(dá)式的值是3沒(méi)有錯(cuò)(因?yàn)槭窍惹笾翟僮栽觯玜++的副作用在什么時(shí)候發(fā)生是并不確定的,且其他的a是什么時(shí)候取值也是不確定的。我只知道在整個(gè)語(yǔ)句結(jié)束之后a的值肯定是4,但a也可能在取第一個(gè)a的值時(shí)就已經(jīng)是4了......也可能第一個(gè)a還是3,第二個(gè)a就是4了......也可能所有的a都是3......這一切都是有可能的,所以這段代碼的行為就是未定義的。
對(duì)于寫(xiě)復(fù)合表達(dá)式,一般建議:如果表達(dá)式改變了一個(gè)操作數(shù)的值,那就不要在這個(gè)復(fù)合表達(dá)式中再次使用這個(gè)操作數(shù)。除非你能確定“改變值”和“使用值”的先后順序。?在這個(gè)例子中,顯然你不能確定順序。
2015-03-05
根據(jù)優(yōu)先級(jí)順序,先計(jì)算a++,a++命令先算前面的,最后再加一。所以a++結(jié)果為3,然后根據(jù)優(yōu)先級(jí)順序,先計(jì)算b%a=1,b/a=1(整數(shù)計(jì)算結(jié)果只能是整數(shù)),a*b=3*4=12,總算式答案為3+1-1+12-3=12,最后在輸出之前,a加一,故a輸出為4,答案輸出為12.
2015-03-05
a++的意思是,把先a帶入算式,等到算完所有的之后——,然后再把a(bǔ)拿過(guò)來(lái)加加,這種類型的題目是初學(xué)c語(yǔ)言的易錯(cuò)點(diǎn)和難點(diǎn)。
2015-01-30
a++ 是先取值再計(jì)算,++a 是先計(jì)算再取值