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