2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

誰說C語言很簡單? | 酷殼 - CoolShell.cn

 姚小夭 2010-09-27
 
前兩天,Neo寫了一篇《語言的歧義》其使用C語言討論了一些語言的歧義。大家應(yīng)該也順便了解了一下C語言中的很多不可思異的東西,可能也是你從未注意到的東西。

是的,C語言并不簡單,讓我們來看看下面這些示例:

  1. 為什么下面的代碼會(huì)返回0?(這題應(yīng)該很簡單吧)

     

      int x;
        return x == (1 && x);
        

    本題主要是關(guān)于C/C++中變量初始化的問題。

  2. 為什么下面的代碼會(huì)返回0而不是-1?
     return ((1 - sizeof(int)) >> 32);
        

    答案:sizeof 是一個(gè)unsigned的類型,所以……

  3. 代碼作用域是一件很詭異的事,下面這個(gè)函數(shù)返回值是什么?

     

    int x = 5;
        int f() {
        int x = 3;
        {
        extern int x;
        return x;
        }
        }
        

    答案:5

  4. 函數(shù)和函數(shù)指針可以相互轉(zhuǎn)換。下面的語句哪些是合法的?

     

    int (*pf)(void);
        int f(void)
        {
        pf = &f; // 沒問題
        pf = ***f; // 取址?
        pf(); // 函數(shù)指針可以調(diào)用?
           (****pf)();  // 這又是什么?
        (***************f)(); // 這個(gè)夠變態(tài)了吧?
        }
        

    答案:全部合法。

  5. 初始化可能是ISO C中最難的部分了。無論是MSVC 還是GCC 都沒有完全實(shí)現(xiàn)。GCC 可能更接近標(biāo)準(zhǔn)。在下面的代碼中,i.nested.yi.nested.z的最終值是什么?
    struct {
        int x;
        struct {
        int y, z;
        } nested;
        } i = { .nested.y = 5, 6, .x = 1, 2 };
        

    答案:2和6

  6. 下面這個(gè)示例是C語言的痛,main函數(shù)返回值是什么?
    typedef struct
        {
        char *key;
        char *value;
        } T1;
        typedef struct
        {
        long type;
        char *value;
        } T3;
        T1 a[] =
        {
        {
        "",
        ((char *)&((T3) {1, (char *) 1}))
        }
        };
        int main() {
        T3 *pt3 = (T3*)a[0].value;
        return pt3->value;
        }
        

    答案:1(你知道為什么嗎?)

  7. 下面這個(gè)例就更變態(tài)了。在GCC的文檔中,這個(gè)語法是合法的,但是不知道為什么GCC并沒有實(shí)現(xiàn)。下面的代碼返回 2.
     return ((int []){1,2,3,4})[1];
        

     

  8. 在下面的這個(gè)示例中,有一個(gè)“bar” 函數(shù)及其函數(shù)指針 “pbar” 的兩個(gè)拷貝(static 類型一般作用于語句塊或文件域).
      int foo() {
        static bar();
        static (*pbar)() = bar;
        }
        static bar() {
        return 1;
        }
        static (*pbar)() = 0;
        

     

  9. 下面的這個(gè)函數(shù)返回值是什么?取決于編譯器是先處理unsigned long轉(zhuǎn)型,還是負(fù)號(hào)。
      unsigned long foo() {
        return (unsigned long) - 1 / 8;
        }
        

    如果是: ((unsigned long) - 1) / 8,那將是一個(gè)很大的數(shù)。
    如果是: (unsigned long) (- 1 / 8 ), 那將是 0

是的,這樣使用C語言可能很奇怪,不過我們可以從另一方面了解C語言的很多我們不常注意的特性。C語言其實(shí)并不容易。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多