http://stevenkobes.com/ctest.html
在這個(gè)網(wǎng)站上發(fā)現(xiàn)一套很有趣的C語(yǔ)言測(cè)試題,如果你招聘C語(yǔ)言相關(guān)開(kāi)發(fā)人員,或者正在學(xué)習(xí)C語(yǔ)言,很值得做一做。
如果沒(méi)有做,下面內(nèi)容暫時(shí)不要看,最好自己先完成一遍。
OK,假設(shè)你做的答案沒(méi)有完全正確,那你可以繼續(xù)看下去了,否則,后面內(nèi)容對(duì)你來(lái)說(shuō)就是小菜一碟,不值得看。
第一題:
#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,會(huì)設(shè)置jmp_buf,然后返回0。當(dāng)調(diào)用longjmp時(shí),會(huì)把longjmp里面的非0值作為setjmp的返回值返回(如果longjmp的value參數(shù)為0,setjmp恢復(fù)后返回1,也就是當(dāng)恢復(fù)到setjmp存儲(chǔ)點(diǎn)的時(shí)候,setjmp一定不會(huì)返回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,這個(gè)算是比較簡(jiǎn)單,pt為指向結(jié)構(gòu)s的指針,然后將pt轉(zhuǎn)換為int指針,進(jìn)行dereference,取出一個(gè)int值,那就是結(jié)構(gòu)中第一個(gè)數(shù)。
我們將題目改動(dòng)一下,如下代碼
第三題:
第四題: