<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            C語言

            有助于理解C語言的測試題

            時間:2025-01-16 14:05:13 C語言 我要投稿
            • 相關推薦

            有助于理解C語言的測試題

              引導語:對有些人來說C語言是比較難以理解的一種編程語言,以下是小編整理的有助于理解C語言的測試題,歡迎參考閱讀!

            有助于理解C語言的測試題

              第一題:

              #include

              02 staticjmp_bufbuf;

              03 intmain(void)

              04 {

              05 volatileintb = 3;

              06 if(setjmp(buf) != 0)

              07 {

              08 printf("%dn", b);

              09 exit(0);

              10 }

              11 b = 5;

              12 longjmp(buf, 1);

              13 }

              輸出結果為A)3 B)5 C)0 D)都不是

              答案為B,也就是輸出5。

              關鍵點在于理解setjmp以及longjmp,第一次運行到setjmp,會設置jmp_buf,然后返回0。當調用longjmp時,會把longjmp里面的非0值作為setjmp的返回值返回(如果longjmp的value參數為0,setjmp恢復后返回1,也就是當恢復到setjmp存儲點的時候,setjmp一定不會返回0)。

              setjmp-longjmp組合的用處類似于游戲中的存盤讀盤功能,經常被用于類似C++的異常恢復操作。

              第二題:

              1 structnode

              2 {

              3 inta;

              4 intb;

              5 intc;

              6 };

              7 structnode s = { 3, 5, 6 };

              8 structnode *pt = &s;

              9 printf("%dn", *(int*)pt);

              返回結果為3,這個算是比較簡單,pt為指向結構s的指針,然后將pt轉換為int指針,進行dereference,取出一個int值,那就是結構中第一個數。

              我們將題目改動一下,如下代碼:

              structnode

              02 {

              03 chara;

              04 charb;

              05 shortc;

              06 intd;

              07 };

              08 structnode s = { 3, 5, 6, 99 };

              09 structnode *pt = &s;

              10 printf("%Xn", *(int*)pt);

              需要注意的是一般32位C編譯器都認為char是8bit,short是16bit,int為32bit,所以node在內存中應該正好是對齊的,也就是abc這幾個成員之間沒有空隙。最終結果應該為60503,如果不是,歡迎你告訴我你具體的編譯環境以及硬件配置。

              第三題:

              1 intfoo(intx,intn){

              2 intval = 1;

              3 if(n > 0)

              4 {

              5 if(n % 2 == 1) val *= x;

              6 val *= foo(x * x, n / 2);

              7 }

              8 returnval;

              9 }

              這道題其實最簡單的辦法就是在紙上做一個推演計算,一步一步跑一下,就能得到答案了,這里面沒有任何復雜的C語言概念。

              第四題:

              1 inta[5] = { 1, 2, 3, 4, 5 };

              2 int*ptr = (int*)(&a + 1);

              3 printf("%d %dn", *(a + 1), *(ptr – 1));

              這道題考的其實是指向數組的指針,&a是一個隱式的指向int [5]數組的指針,它和int* ptr是不一樣的,如果真要定義這個指針,應該是int (*ptoa)[5]。所以ptoa每一次加一操作都相當于跨越int a[5]的內存步長(也就是5個int長度),也就是說&a + 1其實就是指向了a[5]這個位置,實際上內存里面這個位置是非法的,但是對ptr的強制轉換導致了后面ptr-1的內存步長改為了1個int長度,所以ptr-1實際指向了a[4]。至于*(a+1)沒什么好說的,值就是2。

              第五題:

              01 voidfoo(int[][3]);

              02 intmain(void)

              03 {

              04 inta[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

              05 foo(a);

              06 printf("%dn", a[2][1]);

              07 return0;

              08 }

              09 voidfoo(intb[][3])

              10 {

              11 ++b;

              12 b[1][1] = 9;

              13 }

              其實和前一題有異曲同工之妙,++b的步長實際上是3個int,也就是++b運算以后,b指向{4,5,6}這個數組的開始,而b[1]就是{7,8,9}, b[1][1]實際上就是8這個值也就是main函數中的a[2][1].

              第六題:

              inta, b, c, d;

              2 a = 3;

              3 b = 5;

              4 c = a, b;

              5 d = (a, b);

              6 printf("c=%d ", c);

              7 printf("d=%dn", d);

              這個其實有兩個C語言知識點,一個是等號操作符優先級高于逗號操作符,另一個是逗號操作符相當于運算逗號前半部后半部的表達式,然后返回后半部表達式的值。所以c等于a(先計算等號),而d等于b(逗號表達式返回b)。

              第七題:

              1 inta[][3] = {1, 2, 3, 4, 5, 6};

              2 int(*ptr)[3] = a;

              3 printf("%d %d ", (*ptr)[1], (*ptr)[2]);

              4 ++ptr;

              5 printf("%d %dn", (*ptr)[1], (*ptr)[2]);

              依然是2維數組相關題目,ptr為指向int [3]數組的指針,首先指向a[0],所以(*ptr)[1], (*ptr)[2]就是a[0][1], a[0][2].然后++ptr,相當于ptr指向了a[1],這時得到的是a[1][1],a[1][2],所以結果就是2,3, 5, 6。

              第八題:

              01 int*f1(void)

              02 {

              03 intx = 10;return&x;

              04 }

              05 int*f2(void)

              06 {

              07 int*ptr; *ptr = 10;returnptr;

              08 }

              09 int*f3(void)

              10 {

              11 int*ptr; ptr =malloc(sizeof*ptr);returnptr;

              12 }

              這里考的是返回一個指針的問題,一般來說返回指針的函數,里面一定有malloc之類的內存申請操作,傳入指針類型,則是對指針指向的內容做修改。如果想修改指針本身,那就要傳入指針的指針。

              第九題:

              1 inti = 3;intj;

              2 j =sizeof(++i + ++i);

              3 printf("i=%d j=%dn", i, j);

              這道題考的內容其實就是sizeof,如果計算表達式,那么表達式是不會做計算的,也就是不管加加減減,sizeof就是針對i計算大小。在32位機器上,這個j應該為4。

              我將代碼擴展了一下,看看大家能不能想到結果:

              1 shortm;intn;doubledn;

              2 intj =sizeof( m + n);

              3 intk =sizeof( n + n);

              4 intl =sizeof( m);

              5 intl2 =sizeof(m * m);

              6 intl3 =sizeof(m + dn);

              7 intl4 =sizeof(m + m);

              第十題:

              01 voidf1(int*,int);

              02 void(*p[2])(int*,int);

              03 intmain(void)

              04 {

              05 inta = 3;

              06 intb = 5;

              07 p[0] = f1;

              08 p[1] = f1;

              09 p[0](&a, b);

              10 printf("%d %d ", a, b);

              11 p[1](&a, b);

              12 printf("%d %dn", a, b);

              13 return0;

              14 }

              15 voidf1(int*p,intq)

              16 {

              17 inttmp = *p; *p = q; q = tmp;

              18 }

              函數指針的數組p勉強算是一個知識點,另外一個知識點就是第八題提到的,對于int q這樣的參數,是不會修改其內容的。而*p則可修改p指向的內容。

              第十一題:

              01 voide(int);

              02 intmain(void)

              03 {

              04 inta = 3;

              05 e(a);

              06 put'n');

              07 return0;

              08 }

              09 voide(intn)

              10 {

              11 if(n > 0)

              12 {

              13 e(–n);

              14 printf("%d ", n);

              15 e(–n);

              16 }

              17 }

              這道題自己debug一下就完全明白了,主要知識點就是遞歸調用,另外前置后置自減操作的返回值問題。

              第十二題:

              1 typedefint(*test)(float*,float*);

              2 test tmp;

              也是經常出現的一類題,對復雜的指針定義做解析,實際上K&R里面(5.12)也有介紹該如何解讀。不熟悉的朋友可以試著練習練習標準庫中的bsearch,qsort以及signal函數。

              第十三題:

              1 charp;

              2 charbuf[10] = {1, 2, 3, 4, 5, 6, 9, 8};

              3 p = (buf + 1)[5];

              4 printf("%dn", p);

              也就是p實際指向*(buf + 1 + 5),寫的更詭異一些就是p=5[buf +1];也是同樣結果。

              第十四題:

              類似十三題,也是把數組弄得有些詭異,(p += sizeof(int))[-1];相當于*(p + sizeof(int) + (-1))。

              第十五題:

              01 intripple(intn, …)

              02 {

              03 inti, j, k;

              04 va_listp;

              05 k = 0;

              06 j = 1;

              07 va_start(p, n);

              08 for(; j < n; ++j)

              09 {

              10 i =va_arg(p,int);

              11 for(; i; i &= i – 1)

              12 ++k;

              13 }

              14 returnk;

              15 }

              16 intmain(void)

              17 {

              18 printf("%dn", ripple(3, 5, 7));

              19 return0;

              20 }

              這道題也是兩個知識點,一個是可變參數函數定義以及如何實現,va_arg會把5,7依次取出來。另一個知識點是i &= i-1,實際上是計算了i二進制形式中1的個數,每次計算都會消減掉最低有效位上的1。比如7二進制表示為111。i &= i –1的計算結果依次為110,100, 000 (也就是0)。在hacker's Delights這本書里介紹了很多類似技巧。

              第十六題:

              01 intcounter(inti)

              02 {

              03 staticintcount = 0;

              04 count = count + i;

              05 returncount;

              06 }

              07 intmain(void)

              08 {

              09 inti, j;

              10 for(i = 0; i <= 5; i++) j = counter(i);

              11 printf("%dn", j);

              12 return0;

              13 }

              只要了解靜態局部變量的真正內涵,這道題就是小菜啦。

            【有助于理解C語言的測試題】相關文章:

            C語言變量理解07-28

            關于C語言變量理解08-13

            如何理解C語言指針05-19

            C語言測試題及答案07-03

            C語言測試題及答案解析11-04

            C語言自我檢測試題10-03

            C語言自測試題08-11

            C語言考試模擬測試題10-21

            常用C語言測試題及答案09-12

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看