呐,这次我又来装逼了。我保证,这是这学期最后一次。

如果从我在百度C++吧的第一次发言(2009年7月2日)到今天,日子已经过去了2380天,然而我之前还没有考过一次C语言。好慌……好了好了,打住,不然待会儿真被当成装逼了。不过我说我初学的时候用while包住过main你信?至少你没有这样干过吧。

那么,我尽力,把自己带入2380个日子前,努力以一个初学者的视角来想一下C语言到底包含着什么知识点。我承认这种方法充满了应试色彩,而且对于上机写代码这种形式的考试可能并没有十分显著的作用。不过我是真的希望每个看到这篇文章的读者,即使以后不靠C语言吃饭,写不出优秀的C代码,也至少能对C语言有一个正确的理解。那我即使是背上装逼的骂名,也心满意足了。(其实我会告诉你我是因为不想复习物理了吗)

关于新手指引之类的内容,我都写在了那个「C指引」的文档里,点击打开它的GitHub页面。外加精力有限,因此不想再重复那些内容。所以我会列一些问题,并且不会给出答案。希望能迫使你思考。这些问题可能会带有我自己的主观色彩,不喜欢就点关闭咯。

先从初级开始。

  1. C语言代码文件的后缀名是什么?这类文件可以用哪些工具打开和浏览?
  2. 什么是可执行文件?它需要另外的软件打开它吗?
  3. C语言文件从源代码到可执行文件的过程叫做什么?这个过程中发生过什么?
  4. 如果我要输出Hello, world!,我需要在程序的第一行写上什么?如果不写有什么后果?
  5. 为什么程序执行时候的窗口会一闪而过?那个黑色的窗口究竟是什么?
  6. main是什么?我把代码写在main外面会有什么后果?
  7. main前面应该是void还是int?
  8. 变量的存在有什么意义?C语言里的变量有哪些类型?
  9. 我怎么去获取来自用户在命令行的输入?接受输入的函数跟输出的函数在调用方式上有什么区别?
  10. 既然一个字符串在代码里不能跨很多行书写,那么我怎么在字符串里表示换行?制表符呢?
  11. while语句和do…while语句的区别在哪里?
  12. switch…case语句里的break有什么作用?它和if语句比有什么局限性?
  13. 对于if语句括号里的内容来说,一个等号和两个等号有什么差别?两个等号中间能有空格吗?
  14. 如果变量a是double类型,那a=5/2之后a的值应该是多少?

什么,觉得太简单了是吧?那来中级的问题:

  1. 如下的代码会按何种方式执行?会输出什么结果?
    int sample = 1, ok = 0;
    if (sample == 1)
        if (ok)
       puts("Ok.\n");
    else
        puts("No.\n");
    
  2. goto语句是如何使用的?为什么我们提倡不使用goto语句?
  3. 什么时候程序需要函数声明?函数声明应该放在哪里?
  4. 到底什么是EOF?EOF可以用在我们输入的什么地方?
  5. i++和++i有什么不同?i+++++i这种表达式有意义吗?
  6. 应该如何安全地读取一个文件里的内容?写文件呢?
  7. 说出数组和指针的区别(至少三个)
  8. 字符类型有数值吗?strcmp的返回值有什么含义?
  9. static和extern关键字有什么用?

啊哈,还是不满足吗?我们来看看高级篇:

  1. 为什么在main函数里定义一个非常大的数组,程序可能会崩掉,而我放到外面就不会了?
  2. char *const和const char*的区别在哪里?对于声明const char *s=”abcd”,这个指针s到底「指向」什么地方?
  3. 如果我像这样定义:
    typedef char* sptr;
    const sptr b;
    

    这里的b到底是什么类型?是const char*吗?

  4. 考虑这样一个结构体:
    struct sample {
     int  a;
     char b;
    };
    

    sizeof(struct sample)的值会是多少?为什么?