谁说C语言很简单?

原创 2009年05月26日 17:17:00

原文:http://cocre.com/?p=873

 

  • 关于在回复里骂我的朋友们,无所谓哦,呵呵,大家有空可以看看我的另一篇文章《惹恼程序员的十件事》,我们可爱的程序员。
  • 如果你觉得文章有意思,你可以看看我的另一篇文章——《C语言的谜题

 

前两天,Neo写了一篇《语言的歧义》其使用C语言讨论了一些语言的歧义。大家应该也顺便了解了一下C语言中的很多不可思异的东西,可能也是你从未注意到的东西。

是的,C语言并不简单,让我们来看看下面这些示例:

  1. 为什么下面的代码会返回0?(这题应该很简单吧)

     

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

    本题主要是关于C/C++中变量初始化的问题。

     

  2. 为什么下面的代码会返回0而不是-1?
     return ((1 - sizeof(int)) >> 32);
    

    答案:sizeof 是一个unsigned的类型,所以……

  3. 代码作用域是一件很诡异的事,下面这个函数返回值是什么?

     

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

    答案:5

  4. 函数和函数指针可以相互转换。下面的语句哪些是合法的?

     

    int (*pf)(void);
    int f(void)
    {
    
       pf = &f; // 没问题
       pf = ***f; // 取址?
       pf(); // 函数指针可以调用?
       (****pf)();  // 这又是什么?
       (***************f)(); // 这个够变态了吧?
    }
    

    答案:全部合法。

  5. 初始化可能是ISO C中最难的部分了。无论是MSVC 还是GCC 都没有完全实现。GCC 可能更接近标准。在下面的代码中,i.nested.yi.nested.z的最终值是什么?
    struct {
       int x;
       struct {
           int y, z;
       } nested;
    } i = { .nested.y = 5, 6, .x = 1, 2 };
    

    答案:2和6

  6. 下面这个示例是C语言的痛,main函数返回值是什么?
    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. 下面这个例就更变态了。在GCC的文档中,这个语法是合法的,但是不知道为什么GCC并没有实现。下面的代码返回 2.
     return ((int []){1,2,3,4})[1];
    

     

  8. 在下面的这个示例中,有一个“bar” 函数及其函数指针 “pbar” 的两个拷贝(static 类型一般作用于语句块或文件域).
      int foo() {
         static bar();
         static (*pbar)() = bar;
    
      }
    
      static bar() {
        return 1;
      }
    
      static (*pbar)() = 0;
    

     

  9. 下面的这个函数返回值是什么?取决于编译器是先处理unsigned long转型,还是负号。
      unsigned long foo() {
        return (unsigned long) - 1 / 8;
      }
    

    如果是: ((unsigned long) - 1) / 8,那将是一个很大的数。
    如果是: (unsigned long) (- 1 / 8 ), 那将是 0

是的,这样使用C语言可能很奇怪,不过我们可以从另一方面了解C语言的很多我们不常注意的特性。C语言其实并不容易。

一个简单的C语言编译器

  • 2014年08月27日 09:40
  • 31KB
  • 下载

《入门其实很简单:C语言入门很简单》

  • 2014年07月03日 16:56
  • 46.83MB
  • 下载

贪吃蛇C语言实现(简易版)

一 引言 刚学习完C语言,寒假就迫不及待的学习这个贪吃蛇小程序。不得不说,写完还是大有收获的。 二 基本原理 对于贪吃蛇怎么在屏幕上移动,当初自己也是懵逼,哈哈。其实就是不断刷新屏幕...
  • qq_37074040
  • qq_37074040
  • 2017年01月28日 11:09
  • 15947

C语言中*和&的区别-代码实现说明

*是指针运算符,可以表示一个变量是指针类型;也可以表示一个指针变量的所指向的存储单元,可以获取某个地址存储的值。 &是取地址符号,既取得某一个变量的地址 int *p=&a; 或 int *p; p...
  • qq_20366761
  • qq_20366761
  • 2016年10月23日 19:51
  • 848

C语言入门图书兼全国计算机等级考试二级C语言教材《C语言其实很简单》简介目录前言书摘

  • 2015年09月25日 13:04
  • 382KB
  • 下载

谁说C语言很简单?

原文:http://cocre.com/?p=873 关于在回复里骂我的朋友们,无所谓哦,呵呵,大家有空可以看看我的另一篇文章《惹恼程序员的十件事》,我们可爱的程序员。如果你觉得文章有意思,你可以看看...
  • haoel
  • haoel
  • 2009年05月26日 17:17
  • 14506

《谁说C语言很简单》

前两天,Neo写了一篇《语言的歧义》其使用C语言讨论了一些语言的歧义。大家应该也顺便了解了一下C语言中的很多不可思异的东西,可能也是你从未注意到的东西。是的,C语言并不简单,让我们来看看下面这些示例:...
  • luokaijie
  • luokaijie
  • 2011年04月01日 10:46
  • 274

谁说C语言很简单?

谁说C语言很简单 C语言并不简单,让我们来看看下面这些示例: 为什么下面的代码会返回0?(这题应该很简单吧)   int x; return x == (1 && x); ...
  • lh842824672
  • lh842824672
  • 2014年04月11日 13:31
  • 591

C语言从入门到精通PDF完整版

  • 2014年04月02日 23:21
  • 45.54MB
  • 下载

陈皓的C语言系列文章合集

单看这文章的标题,你可能会觉得好像没什么意思。你先别下这个结论,相信这篇文章会对你理解C语言有帮助。这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接。微博截图如...
  • zhangyu_jsj
  • zhangyu_jsj
  • 2015年09月06日 10:34
  • 357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谁说C语言很简单?
举报原因:
原因补充:

(最多只允许输入30个字)