預處理器(preprocessor)
1.用預處理指令#define 宣告乙個常數,用以表明1年中有多少秒(忽略閏年問題)?
#define seconds_per_year (60 * 60 * 24 * 365)ul
我在這想看到幾件事情:
1. #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)
2.懂得預處理器將為你計算常數表示式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
3. 意識到這個表示式將使乙個16位機的整型數溢位-因此要用到長整型符號l,告訴編譯器這個常數是的長整型數。
4.如果你在你的表示式中用到ul(表示無符號長整型),那麼你有了乙個好的起點。記住,第一印象很重要。
2. 寫乙個「標準」巨集min,這個巨集輸入兩個引數並返回較小的乙個。
#define min(a,b) ((a) <=(b) ? (a) : (b))
這個測試是為下面的目的而設的:
1. 標識#define在巨集中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準c的一部分,巨集是方便產生嵌入**的唯一方法,對於嵌入式系統來說,為了能達到要求的效能,嵌入**經常是必須的方法。
2. 三重條件操作符的知識。這個操作符存在c語言中的原因是它使得編譯器能產生比if-then-else更優化的**,了解這個用法是很重要的。
3. 懂得在巨集中小心地把引數用括號括起來
4. 我也用這個問題開始討論巨集的***,例如:當你寫下面的**時會發生什麼事?
least = min(*p++, b);
3. 預處理器標識#error的目的是什麼?
#是生成字串:
#define a(x) #x
a(abc) => "abc"
##是連線:
#define a(x) abc##x
a(123) => abc123
#error是生成編譯錯誤訊息:
#ifdef abc
#error something wrong...
#endif
//如果
abc是已經定義的巨集,那麼編譯的時候就會顯示錯誤訊息
something wrong...
晦澀的語法
16. c語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什麼?
int a = 5, b = 7, c;
c = a+++b;
這個問題將做為這個測驗的乙個愉快的結尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,根據最處理原則,編譯器應當能處理盡可能所有合法的用法。因此,上面的**被處理成:
c = a++ + b;
因此, 這段**持行後a = 6, b = 7, c = 12。
如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當作問題。我發現這個問題的最大好處是:這是乙個關於**編寫風格,**的可讀性,**的可修改性的好的話題
C語言測試題
1 c程式的入口 a switch b if c main d getchar 2.c語言中,整數型別中的浮點型別,常用的關鍵字是 a int b char c short d float 3.輸出整數型別的格式符是 a d b c c x d o 4.輸出浮點型別的格式符是 a c b o c d...
C語言幾個精典的測試題
最近學習c語言,發現有幾個測試題是最容易錯的,不知道學習c語言的朋友也會犯這樣的錯誤呢?1.大家看以下 會輸出什麼 void main a a b 100 c c d d 我們知道宣告了乙個字元型變數,同時給它初始化為ch a 3 那麼這裡就應該輸出 d 我們知道字元型變數在記憶體中是以整型儲存的,...
C語言測試題07
結構體 自定義複雜 復合型別 由其他基本型別構成 普通型別的缺點 int char 變數之間是沒有關係 結構體描述了一種構成關係 所屬關係 定義乙個結構體型別 描述了學生結構體的構成 型別名是 struct student struct student 給結構體起別名 struct student ...