5段反人類代碼測(cè)測(cè)你對(duì)C語言基礎(chǔ)的理解深度

????????我們?cè)趯W(xué)習(xí)C語言的時(shí)候,通常都會(huì)看到書上存在i+++i++這種反人類寫法,不僅如此,對(duì)于一些C語言的考試也會(huì)存在一些我們平常在開發(fā)時(shí)完全不可能使用的自找麻煩寫法。雖然說這些代碼容易使人血壓升高,但其實(shí)也從側(cè)面反應(yīng)出我們對(duì)C語言部分知識(shí)點(diǎn)的掌握和理解。下面有一些反人類寫法,僅供學(xué)習(xí),試試看你能答對(duì)幾個(gè)呢。
1.下面的程序會(huì)輸出什么結(jié)果呢?

.
.
.
.
.
.
.
.
.
.
????????如果你的答案是3 3的話,那么恭喜你,你已經(jīng)理解了逗號(hào)運(yùn)算符的優(yōu)先級(jí),他是所有運(yùn)算符中優(yōu)先級(jí)最低的,沒錯(cuò),比賦值運(yùn)算符“=”還低,因此上述程序會(huì)將a和b賦值為3,至于 b + 1,有極大的可能會(huì)被編譯器優(yōu)化掉(見下文)。
2.如果在1.的代碼中稍加修改,又會(huì)輸出什么結(jié)果呢?

.
.
.
.
.
.
.
.
.
????????這里與1.的區(qū)別在于將表達(dá)式的后半部分加上了圓括號(hào),確保了對(duì)a的賦值在最后進(jìn)行。如果你理解逗號(hào)運(yùn)算符的另一個(gè)特點(diǎn):從左算起,以最右邊的表達(dá)式值為最終值。那么應(yīng)該不難得到正確答案4 3。
順便提一點(diǎn),在這段程序中,b + 1并沒有被編譯器優(yōu)化掉,對(duì)比兩者的匯編代碼即可得知:


3.下面的程序如果輸入 1 5 回車,會(huì)輸出什么結(jié)果呢?
?

.
.
.
.
.
.
.
.
.
????????對(duì)scanf()這個(gè)函數(shù)有了解的小伙伴肯定就想到了,結(jié)果是1 0而不是1 5。scanf()的輸入必須嚴(yán)格按照格式字符串中的格式輸入,上述程序scanf()的格式字符串中,兩個(gè)%d之間存在著一個(gè)逗號(hào),則若想輸出 1 5,則輸入時(shí)必須將逗號(hào)也輸入,即1,5。
4.下面的程序會(huì)輸出什么結(jié)果呢?

.
.
.
.
.
.
.
.
.
.
????????按我們正常的角度理解,應(yīng)該會(huì)輸出0 20。但結(jié)果卻是 -1 20。這是因?yàn)镃語言的類型隱式轉(zhuǎn)換的層級(jí)unsigned int 是大于int的,因此會(huì)先將a轉(zhuǎn)換為unsigned int 類型,再與b進(jìn)行比較。而a的值為-1,在內(nèi)存中負(fù)數(shù)以補(bǔ)碼的方式存儲(chǔ),-1對(duì)應(yīng)的補(bǔ)碼即0xffffffff,直接轉(zhuǎn)換成無符號(hào)十進(jìn)制數(shù)則是4294967295,很明顯,20是不可能大于這個(gè)數(shù)的,因此if后的條件也不成立,自然就不會(huì)執(zhí)行a自增1。
5.下面的程序會(huì)什么結(jié)果呢?

.
.
.
.
.
.
.
.
.
????????如果你覺得答案是1 0的話,那么就錯(cuò)了。正確答案應(yīng)該是0 0。按正常思路,首先b為0,條件表達(dá)式的值為 : 后的表達(dá)式的值,之后a自增1,那么結(jié)果a應(yīng)該是1。這么想的話,就忽略了一個(gè)重要的因素,++運(yùn)算符的優(yōu)先級(jí)是比條件運(yùn)算 ? 高的。因此表達(dá)式的執(zhí)行流程應(yīng)該是這樣的:先計(jì)算a++,由于++在后,先使用a的值0,此時(shí)表達(dá)式變成了這樣:
a = b ? 1 : 0;
之后,a自增1,此時(shí)a為1是沒錯(cuò)的。執(zhí)行完a++之后,開始執(zhí)行條件表達(dá)式 ? ,很明顯,b為0,那么條件表達(dá)式的值為 : 后的內(nèi)容即0,再對(duì)a賦值0,此時(shí)a為0。 通過這個(gè)分析我們可以知道,a++是有使a自增1的,但是在之后被賦值0覆蓋了,因此a的最終值才會(huì)是0而不是1。
上述程序如果從匯編代碼來看就非常清晰了:

????????反人類代碼是絕對(duì)不能出現(xiàn)于實(shí)際開發(fā)中,否則絕對(duì)絕對(duì)是自找麻煩。但是讀一讀這些代碼還是可以加深對(duì)C語言一些知識(shí)的理解的。