1.下面這個(gè)程序的輸出結(jié)果是什么?
#include<stdio.h> int main() { int i=43; printf("%d\n",printf("%d",printf("%d",i))); return 0; }
參考答案:本程序?qū)⑤敵?321。原因在于先輸出i的值為43然后緊接著輸出printf的返回值!而printf的返回值為輸出的字符的個(gè)數(shù)!所以呢再執(zhí)行完最里面的printf(“%d”,i)打印43之后,接著打印printf(“%d”,43)這句話的返回值即2,然后在打印printf(“%d”,2)的返回值即1.所以最后結(jié)果為4321
2.下面這個(gè)程序運(yùn)行后,m和n的值是多少?
#include<stdio.h> int main() { int a=4,b=3,c=2,d=1,m=2,n=2; (m=a<b)&&(n=c>d); printf("m=%d,n=%d",m,n); return 0; }
參考答案:m=0,n=2 第一個(gè)m為0我相信大家這個(gè)都沒什么問題,至于第二個(gè)n為什么是2,有人可能會(huì)想c>d不是成立嗎?那應(yīng)該返回真也就是1給n,為什么還是2呢?原因在于&&和||運(yùn)算符都是短路運(yùn)算符,即編譯器一旦發(fā)現(xiàn)與整體表達(dá)式無關(guān),那么求值立刻終止。所以在計(jì)算出a<b為假以后,那么&&右邊的表達(dá)式真假已沒有意義了。
3. 以下程序的輸出結(jié)果是什么?
#include<stdio.h> int main() { int i; i = 10; printf("i : %d\n",i); printf("sizeof(i++) is: %d\n",sizeof(i++)); printf("i : %d\n",i); return 0; }
輸出的三個(gè)值會(huì)是 10、4、11嗎?如果你也是這個(gè)答案那就錯(cuò)了!
第一個(gè)10沒問題,第二個(gè)是求int類型數(shù)據(jù)的大小,也是4,也沒問題。問題在于在sizeof()里還有個(gè)副作用++,難道這個(gè)沒有執(zhí)行嗎?怎么還可能是10呢?原因在于sizeof是一個(gè)關(guān)鍵字,而非函數(shù)!i++在編譯器看來是可以在運(yùn)行前也就是編譯的時(shí)候就確定了的。故sizeof(i++)其實(shí)就是4。更不會(huì)有i++了。所以最后結(jié)果為10、4、10。
C語言研究中心(www.sztianhecheng.cn)