1.以下程序的結(jié)果是什么?
int i = 1; int main() { int i = i; return 0; }
A: main()函數(shù)里的i是一個(gè)未定義值
B: main()函數(shù)的i為1
C: 編譯器不允許這種寫法
D: main()里i的值為0
解答:當(dāng)筆試者看到此代碼時(shí),可能會(huì)覺得古怪。雖然在C++中編譯是可以通過的(顯然是不合理)。當(dāng)main()函數(shù)里的i從定義開始,外部的全局變量i就已經(jīng)被屏蔽掉,所以main()函數(shù)里作為右值的i的值不會(huì)0也不會(huì)是1,與外部的i無關(guān)。而是一個(gè)未定義的符號(hào)。
答案:A
2.以下程序的輸出結(jié)果是什么?
#include<stdio.h> int main() { int arr[]={11,12,13,14,15}; int *ptr = arr; *(ptr++) += 100; printf("%d %d\n",*ptr,*(++ptr)); return 0; }
A:13 13
B:112 13
C :12 12
D:12 13
解析:本題主要考察指針以及棧的概念 。ptr首先指向數(shù)組arr的第一個(gè)元素,*(ptr++) += 100之后,arr中的0號(hào)元素即a[0]變成了111,別忘了ptr也向后挪了一位即指向1號(hào)元素,此時(shí)*ptr的值為12。問題來了:printf(“%d %d\n”,*ptr,*(++ptr))的輸出結(jié)果竟然不是12 13 而是13 13 原因在于printf的兩個(gè)參數(shù)壓棧順序?yàn)閺挠抑磷?,故也先?jì)算*(++ptr),所以ptr已經(jīng)指向了arr[2],所以兩次都是13
答案:A
3. 以下代碼說法正確的是:
#include<stdio.h> int main(void) { char aChar; int aInt; aInt = aChar = -120; printf("%d\n",aInt); return 0; }
A:一定輸出-120
B:一定不能輸出-120
C:可能輸出-120
D:輸出%d
解答:本題乍一看,-120木有問題! 再仔細(xì)一看 char類型表示的數(shù)據(jù)范圍是-128~127,也沒有溢出。應(yīng)該沒錯(cuò)咯。但本題考查的重點(diǎn)并非在此。重點(diǎn)在于aInt = aChar = -120;這句話,為什么呢?我們知道=號(hào)的意思是賦值,是從右往左運(yùn)算,那第一步會(huì)將-120賦給aChar。第二步是aChar的值給aInt。對于第一步?jīng)]有什么要說的。第二步呢就有個(gè)問題了。以32位系統(tǒng)常規(guī)平臺(tái)來看,是將8字節(jié)數(shù)據(jù)的char類型變量放到32個(gè)字節(jié)的int變量里去,那這里就存在一個(gè)問題了!沒錯(cuò),那就是大小端存儲(chǔ)導(dǎo)致的問題,即-120這個(gè)數(shù)字對應(yīng)的八個(gè)位的二進(jìn)制碼是放到int變量的高位還是低位,所以結(jié)果自然不必多說了。
答案:C
C語言研究中心(www.sztianhecheng.cn)