http://stevenkobes.com/ctest.html
在這個網站上發現一套很有趣的C語言測試題,如果你招聘C語言相關開發人員,或者正在學習C語言,很值得做一做。
如果沒有做,下面內容暫時不要看,最好自己先完成一遍。
OK,假設你做的答案沒有完全正確,那你可以繼續看下去了,否則,后面內容對你來說就是小菜一碟,不值得看。
第一題:
#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);
}
輸出結果為A)3 B)5 C)0 D)都不是
答案為B,也就是輸出5。
關鍵點在于理解setjmp以及longjmp,(http://en.wikipedia.org/wiki/Setjmp.h )第一次運行到setjmp,會設置jmp_buf,然后返回0。當調用longjmp時,會把longjmp里面的非0值作為setjmp的返回值返回(如果longjmp的value參數為0,setjmp恢復后返回1,也就是當恢復到setjmp存儲點的時候,setjmp一定不會返回0)。
setjmp-longjmp組合的用處類似于游戲中的存盤讀盤功能,經常被用于類似C++的異常恢復操作。
第二題:
struct node
{
int a; int b; int c;
};
struct node s = { 3, 5, 6 };
struct node *pt = &s;
printf("%d/n", *(int*)pt);
返回結果為3,這個算是比較簡單,pt為指向結構s的指針,然后將pt轉換為int指針,進行dereference,取出一個int值,那就是結構中第一個數。
我們將題目改動一下,如下代碼
第三題:
第四題: