http://stevenkobes.com/ctest.html
在這個網(wǎng)站上發(fā)現(xiàn)一套很有趣的C語言測試題,如果你招聘C語言相關(guān)開發(fā)人員,或者正在學(xué)習(xí)C語言,很值得做一做。
如果沒有做,下面內(nèi)容暫時不要看,最好自己先完成一遍。

OK,假設(shè)你做的答案沒有完全正確,那你可以繼續(xù)看下去了,否則,后面內(nèi)容對你來說就是小菜一碟,不值得看。
第一題:
#include <setjmp.h>
static jmp_buf buf;
int main(void)
{
volatile int b = 3;
if (setjmp(buf) != 0)
{
printf("%d/n", b);
exit(0);
}
b = 5;
longjmp(buf, 1);
}
輸出結(jié)果為A)3 B)5 C)0 D)都不是
答案為B,也就是輸出5。
關(guān)鍵點(diǎn)在于理解setjmp以及l(fā)ongjmp,(http://en.wikipedia.org/wiki/Setjmp.h )第一次運(yùn)行到setjmp,會設(shè)置jmp_buf,然后返回0。當(dāng)調(diào)用longjmp時,會把longjmp里面的非0值作為setjmp的返回值返回(如果longjmp的value參數(shù)為0,setjmp恢復(fù)后返回1,也就是當(dāng)恢復(fù)到setjmp存儲點(diǎn)的時候,setjmp一定不會返回0)。
setjmp-longjmp組合的用處類似于游戲中的存盤讀盤功能,經(jīng)常被用于類似C++的異常恢復(fù)操作。
第二題:
struct node
{
int a; int b; int c;
};
struct node s = { 3, 5, 6 };
struct node *pt = &s;
printf("%d/n", *(int*)pt);
返回結(jié)果為3,這個算是比較簡單,pt為指向結(jié)構(gòu)s的指針,然后將pt轉(zhuǎn)換為int指針,進(jìn)行dereference,取出一個int值,那就是結(jié)構(gòu)中第一個數(shù)。
我們將題目改動一下,如下代碼
第三題:
第四題: