誰說C語言很簡單?

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

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

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

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

本題主要是關于C/C++中變量初始化的問題。

    為什么下面的代碼會返回0而不是-1?

return ((1 - sizeof(int)) >> 32)

答案:sizeof 是一個unsigned的類型,所以……

代碼作用域是一件很詭異的事,下面這個函數返回值是什么?

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

答案:5

 

  1. 函數和函數指針可以相互轉換。下面的語句哪些是合法的?

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

答案:全部合法。

 

  1. 初始化可能是ISO C中最難的部分了。無論是MSVC 還是GCC 都沒有完全實現。GCC 可能更接近標準。在下面的代碼中,i.nested.y 和i.nested.z的最終值是什么?

struct {
   int x;
   struct {
       int y, z;
   } nested;
} i = { .nested.y = 5, 6, .x = 1, 2 }

答案:2和6

 

  1. 下面這個示例是C語言的痛,main函數返回值是什么?

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

     

 

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. 下面這個例就更變態了。在GCC的文檔中,這個語法是合法的,但是不知道為什么GCC并沒有實現。下面的代碼返回 2.

return ((int []){1,2,3,4})[1];

 

  1.  在下面的這個示例中,有一個“bar” 函數及其函數指針 “pbar” 的兩個拷貝(static 類型一般作用于語句塊或文件域).


  2. int foo() {
         static bar();
         static (*pbar)() = bar;
      }
      static bar() {
        return 1;
      }
      static (*pbar)() = 0
  3. 下面的這個函數返回值是什么?取決于編譯器是先處理unsigned long轉型,還是負號。
  4. unsigned long foo() {
        return (unsigned long) - 1 / 8;
      }

 

 

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

轉自:http://coolshell.cn/articles/873.html

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2257

(0)
s19930811s19930811
上一篇 2016-03-20
下一篇 2016-03-20

相關推薦

  • Ansible Playbook Roles 和 Include 聲明-手稿

    Edit Ansible Playbook Roles 和 Include 聲明 Ansible Playbook Roles 和 Include 聲明 1. Introduction 2. Task Include Files And Encouraging Reuse 3. Roles 4. Role Default Variables 5. Role …

    Linux干貨 2016-03-28
  • 腳本編寫規范

    腳本編寫規范 腳本名稱以.sh結尾,名稱見名知意 盡量使用UTF-8編碼,注釋及輸出盡量使用英文 一般給到執行權限,但一些關于變量的配置文件不用加執行權限 執行的時候可以使用bash執行,或者使用bash -x 調試執行 腳本首行以#!/bin/bash,無空格,不帶選項 第二行為空格或者添加一行空注釋 開始注釋內容:  #!/bin/bash&n…

    Linux干貨 2017-04-16
  • 配置HTTPS

    環境為CentOS 7.3、httpd2.4.6 一 搭建證書 CA 主機為192.168.29.3 client主機為 192.168.29.100 1 生成私鑰 [root@centos7 ~]# (umask 077 ; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) Generating…

    2017-06-06
  • 文本查找之find組合拳

    find命令不僅能幫助我們在數目眾多的文件中快速找到滿足條件的文本,我們還能通過find處理動作對查找到的文件進行進一步的處理。 一、find的特點:               遍歷查找,因此查找速度略慢   &nbs…

    Linux干貨 2016-08-15
  • 第七周作業

    第七周 1,創建一個10G分區,并格式化為ext4文件系統;(1) 要求其block大小為2048,預留空間百分比為2,卷標為MYDATA,默認掛載屬性包含acl;(2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [root@www ~]# fdisk /dev/sda <————-fd…

    Linux干貨 2017-09-03
  • ip命令詳解

      Linux中的ip命令功能強大,可以完成接口配置、路由管理等任務。   格式:ip [ OPTIONS ] OBJECT { COMMAND | help }   下面使用ip命令來完成一些常用的操作:     1、查看接口狀態       ip link show [設備名…

    Linux干貨 2016-01-14
欧美性久久久久