`
bianku
  • 浏览: 72105 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

谁说C语言很简单?

阅读更多

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

 

前两天,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语言很简单?谁说C语言很简单!!!

    谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说C语言很简单谁说...

    大学C语言学生简易管理系统

    大学C语言学生简易管理系统大学C语言学生简易管理系统大学C语言学生简易管理系统大学C语言学生简易管理系统大学C语言学生简易管理系统大学C语言学生简易管理系统大学C语言学生简易管理系统大学C语言学生简易管理系统...

    应该怎样学习C语言?

    掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it...

    用C语言编简单计算器程序

    根据给定文件的信息,我们可以提炼出以下关于使用C语言编写简单计算器程序的相关知识点: ### 1. C语言基础概述 - **定义与背景**:C语言是一种通用的、过程式的编程语言,它由Dennis Ritchie于1972年在贝尔实验室...

    c语言入门很简单

    c语言入门很简单, 从入门到精通 ,学习c语言不在难

    C语言入门很简单

    对于初学者来说,“C语言入门很简单”这一观点既是对学习态度的一种鼓励,也是对C语言特性的一种准确描述。本文将从C语言的基本概念入手,详细介绍其核心语法、常见数据类型、控制结构以及函数等方面的知识点,帮助...

    C语言基础 简单C语言应用程序

    在“C语言基础 简单C语言应用程序”这个主题中,我们将深入探讨C语言的基础知识,了解如何编写简单的C语言应用程序。 首先,C语言的基础包括数据类型。C语言支持基本的数据类型如整型(int)、浮点型(float、...

    c语言小游戏c语言项目源码大全合集(60例).zip

    c语言小游戏c语言项目源码大全合集(60例): c语言24点游戏源码 c语言Turbo C下写的俄罗斯方块 c语言UDP传输系统源码 c语言万年历源码 c语言五子棋源码 c语言俄罗斯方块 c语言做的一个任务管理器 c语言做的播放器...

    一份涵盖大部分学习 C 语言所需要掌握的核心知识,致力于打造最易懂的 C语言入门教程,让天下没有难学的 C语言

    如何创建C语言程序C语言程序组成函数定义格式如何运行编写好的程序C语言程序练习初学者如何避免程序出现BUG多语言对比注释就是这么简单?什么是关键字?什么是标识符?什么是数据?C语言数据类型什么是常量?C语言变量...

    基于C语言的简易连连看

    在本项目"基于C语言的简易连连看"中,我们主要探讨如何利用C语言这一基础编程语言来实现一个简单的电脑游戏——连连看。C语言以其高效、简洁和强大的底层控制能力,是许多初学者和专业程序员学习编程的首选。在这个...

    基于C语言简易计算器

    在本项目"基于C语言简易计算器"中,我们主要探讨如何使用C语言这一基础编程语言来实现一个简单的计算器程序。这个工程旨在帮助初学者更好地理解和应用C语言,并且融入了部分数据结构的概念,使得学习更加深入。下面...

    南开100题2级C语言

    掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去 开发了,这个再一次验证了C语言是程序设计的重要基础。还有啊,多说一点:即使现在招聘程序员,考试都是考C语言,你想加入it...

    C语言简单计算器+实验报告.rar

    《C语言实现简单计算器及其实验报告》 C语言是一种强大的编程语言,被广泛应用于系统开发、软件工程以及教育领域。本资源是针对大一学生的一次课程设计任务,旨在通过实现一个简单的计算器来帮助学生深入理解和掌握...

    收集整理的简单易懂的60套C语言小游戏源代码(可运行,供学习设计参考).zip

    收集整理的简单易懂的60套C语言小游戏源代码(可运行,供学习设计参考): c语言24点游戏源码 c语言Turbo C下写的俄罗斯方块 c语言UDP传输系统源码 c语言万年历源码 c语言五子棋源码 c语言俄罗斯方块 c语言做的一个...

    C语言编写简易的图书管理系统

    使用C语言编写的简单的图书管理系统 ,实现一般图书管理资源鉴定的功能

    C语言很简单.rar

    《C语言很简单》这个压缩包文件,显然包含了与C语言学习相关的资料,可能是教程、示例代码或习题集。虽然描述中提到“C++”的标签,但根据标题,我们主要聚焦在C语言上。C语言是计算机科学的基础编程语言,由Dennis ...

    c语言之简单的easyx

    【标题】:“C语言之简单的EasyX” 在编程领域,C语言是一种基础且强大的编程语言,广泛应用于系统开发、软件构建以及...这对于初学者来说是一个很好的实践项目,可以帮助他们深入理解C语言和图形编程的基本概念。

    C语言简单五子棋源码

    通过C语言实现简单的五子棋双人对战源码,代码量小,结构简单,适合C语言刚入门者学习

    Matlab调用C语言程序简单实例

    标题中的“Matlab调用C语言程序简单实例”是指在MATLAB环境中,通过MEX文件(MATLAB Exchange)来调用C语言编写的程序。MATLAB是一种强大的数值计算和符号计算软件,它提供了丰富的内建函数和工具箱,但有时用户可能...

Global site tag (gtag.js) - Google Analytics