这篇文章将会带领您入C语言的门(),祝您在C语言的道路上从入门到放弃,不,是从入门到精通。

通过这篇文章,您学将到C语言的历史、C语言的用处、C语言开发工具的类型、C语言开发环境的安装和使用、C语言的基本要素及其功能、C语言注释的书写。您将感性地理解了C语言源代码是如何被编译执行的,将理解了顺序执行结构,将掌握了C语言初步的调试方法,将写下了您第一个C语言程序。
在开始之前,我想说,在我看来,实践是学习编程的最好方法。请您跟着这篇文章,尝试者搭建环境,尝试着自己写代码、修改代码、调试代码。我相信,您将收益匪浅。

  1. C语言历史
    C语言(C Programming Language),是由Dennis MacAlistair Ritchie基于BCPL语言于1972年发明。它是一门面向过程、抽象化的通用程序设计语言。
    C语言十分强大,上能开发大型应用高性能程序,下能开发单片机、操作系统。它能与汇编程序紧密相连,它衍生出来的C++语言,广泛应用于游戏开发。它以它高效的执行速度、优雅的语法、强大的功能,在计算机科学的各个领域都有一席之地。

  2. C语言程序的执行过程
    计算机是看不懂我们写的程序代码的,因此我们需要一个翻译,将我们能看懂的语言,翻译成电脑所能理解的二进制语言。通俗地讲,在C语言中,我们通常主要使用一种叫做“编译器”的程序帮我们翻译我们的代码,像这样把代码从源语言编写的源程序,“翻译”成可以被计算机执行目标程序的过程叫做编译(事实上,参与这个过程的程序不止编译器,还有预处理器和链接器等程序。在这篇文章中,我们对它们不加以区分,统称为编译器)。常见的C语言代码编译器有GCC、Clang、MSVC等。
    像我们用记事本、Word编写我们的文章一样,我们可以使用代码编辑器编辑我们的代码。常见的代码编辑器有:Atom、Subline、Visual Studio Code、Vim等。
    我们使用代码调试器来调试我们的代码,调试器可以帮我们发现代码的漏洞、修复程序的故障(Debug),使我们的程序更加完美。常见的C语言代码调试器有GDB、MSVC的调试器等。
    这些东西在一起合作,可以帮助我们更好地帮助我们编写计算机程序。我们ji可以自行分别使用这些程序,也可以将它们集成起来,赋予其图形化的界面的程序,称之为集成开发环境(IDE)。常见的C语言集成开发环境有:Microsoft Visual Studio(号称宇宙第一IDE)、XCode(MacOS上的IDE)、Code::Blocks、Dev-C++等。

  3. C语言环境的搭建
    如何选择IDE呢?在MacOS上,我推荐采用XCode;在Windows上,为了学习标准C语言,我更推荐采用Code::Blocks或Dev-C++作为入门即便它们甚至连像Visual Studio Code这样的编辑器都比不过,但是它安装简单(相较于编辑器的配置),体量小(Visual Stduio只安装C/C++环境要10G左右的空间),更适合入门。在本篇文章中,我们将采用Dev-C++。

    1. 下载安装包:
      点击下载链接1下载链接2下载即可。在我的电脑上,下载链接1更快。
    2. 点击下载好的安装包安装。
      要允许安装程序使用管理员权限(或者说修改您的电脑)。
    3. 选择安装程序语言
      一上来就选语言,但为可选的语言没有中文。在这里,我们使用默认的English。不过没关系,只是安装程序没有中文而已,安装后的程序是有中文的。
      选择语言
    4. 签订契约 用户协议
      点击“I Agree”即可。
      用户协议
    5. 选择安装组件
      安装组件建议选择Full,如果您之前安装过Dev-C++,请勾上最后一个。如果您不想使用TDM-GCC,而要使用别的编译器,请去掉TDM-GCC 4.9.2 Compiler前面的勾。
      安装组件
    6. 选择安装位置
      可以选择软件安装在电脑的位置,如果没有特殊的要求,默认即可。
      安装位置
    7. 安装
      选择好安装位置后,点击Install即可开始安装。
      开始安装
    8. 安装成功
      点击Finish完成安装,并运行Dev-C++程序。
      安装成功
    9. 选择界面语言
      默认是英语(English(Original)),向上找到“简体中文/Chinese”,点击Next即可。
      英语选择界面
      中文选择界面
    10. 选择配色方案
      字体强烈推荐选择Consolas。颜色指代码高亮的配色方案,可以根据自己喜好决定,建议选择暗色调。这里我选择的是Obvilion。图标指的是IDE界面的一些图标,根据自己喜好选择,这里我选择的是New Look。
      选择配色方案
    11. 设置成功
      选择配色方案
      恭喜您,万事开头难,您已经搭建好的Dev-C++环境!
  4. Hello World
    Hello World是一著名的程序,它是大多数程序员入门的第一个程序。它的功能是在控制台输出一个语句“Hello World!”,接下来让我们实现这个程序吧。

    1. 新建项目
      我们打开Dev-C++,单击文件->新建->项目,新建一个项目。项目一个大型的代码程序的大框架,您可以把您所有的代码文件,通过项目进行管理。
      界面
    2. 建立控制台程序
      在弹出的对话框中,选择Basic->Console Application,下方中选择C语言程序,可以将它设为缺省语言。项目名称命名为Hello World,点击确认即可。
      新项目
      选择项目
      文件保存的位置,我建议放在一个与项目同名的文件夹中,这个文件夹是一个固定文件夹下的一个文件夹,这个固定文件夹用来存储您之后所有的代码文件。为了避免出现一些由编码造成的奇奇怪怪的问题,强烈项目所有的路径和文件全部采用英文(使用中文路径可能会出现编码混乱,影响调试器的调试)。
      保存位置
      在默认的界面中,Dev-C++自带了一个程序,您应该能看到类似这样的界面:
      缺省程序
    3. Hello World
      将默认的程序全部删除,将下面的程序复制粘贴上去:

      #include <stdio.h>
      
      int main(void)
      {
          printf("Hello World!\n");
          return 0;
      }
      

      效果如下图所示:
      Hello World
      关于Hello World的程序的含义,我将在待会解释,请您先囫囵吞枣地先复制粘贴一下。接下来请您试着编译和调试它,先熟悉它是怎么被执行的,接下来就能举一反三地理解这个程序了。

  5. C语言的编译和调试

    1. 编译
      在Dev-C++上部,有四个这样的按钮:
      按钮
      它们从左到右依次是:编译(只编译,不运行)、运行(只运行,不编译)、编译运行(既编译,又运行)、全部编译(编译所有的代码文件)。在这四个按钮的相邻的右侧,有一个紫色的对勾——调试,它可以运行调试器(默认是GDB)。它们的快捷键从左到右依次是:F9、F10、F11、F12、F5。编译后的程序不会自动运行,需要您手动运行。程序只有先编译再运行。编译运行相当于先编译、再运行(先F9,再F10)。每次修改代码后,都需要重新编译,否则运行的是上次编译的程序。
      在这里我们选择单击编译运行按钮(相当于先编译(F9)、后运行(F10))。
      接下来,您应该能看到一个黑框,里面是程序输出的Hello World语句。
      Hello World输出
      恭喜您,完成了您的第一个C语言程序。接下来我要对您刚才的操作做一些解释。

      1. 源代码
        您刚才复制的那一段Hello World代码,是一段C语言程序。未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令,我们称之为源代码,或者叫源程序。
        编译后的代码,只有计算机能看懂,而源代码,学过对应的程序设计语言的人都能看懂。开源指源代码对外公开,所有人都有使用它的权力,但受到版权的保护(一般开源代码作者会对这种权力做一些限制,如不能用于商业用途、编写出来的代码要开源等)。对应的,闭源指源代码不对外公开。我们使用的Dev-C++和它的编译器GCC都是开源软件;而我们使用的Windows电脑,是闭源软件(操作系统也是一个软件)。
      2. 编译与运行
        之前提及过,编译是将源代码翻译成机器语言的过程。我们按F9进行编译,实际上就是将源代码翻译的过程。翻译后,我们并不会直接执行这个程序,所以我们需要按F10手动运行它。如果没翻译,则不能运行或者只能运行上次编译出来的可执行程序。编译出来的可执行文件,将被放在您的项目目录中。
        F11编译运行实际上是将上述过程简化,相当于先按编译(F9)、后按运行(F10)。
      3. 黑框
        黑框实际上是Windows的控制台,代码实际上是将输出的文字输出到在终端中,之后我们会讲解如何将输出输出到文件。
        什么?您不喜欢黑框,您想创建窗体应用程序?
        控制台程序是每一个学习C语言的人的必经之路,是基础中的基础,绕不开的。创建图形界面程序,可以采用Qt、MFC,它们都是基于标准C/C++语言的。如果您对性能要求不苛刻的话,可以学习Visual Basic.net等更适合图形界面开发的程序设计语言。
    2. 调试
      先将Dev-C++的编译选项由默认的TDM-GCC 4.9.2 64bit Release更改为TDM-GCC 4.9.2 64bit Debug,进入Debug模式。
      选择Debug
      点击确认即可:
      更改默认设置
      单击左侧的代码行号的左侧,对应代码行号上会出现一个红点。这个点我们称之为端点。程序在断点处会停下。
      断点
      接下来我们先编译(F9),再调试(F5)。
      Debug
      接下来,您会看到程序执行到您的断点处(命中断点),蓝色的语句表示下一步将被执行的语句,控制台没有输出。
      命中断点
      点击左下侧的“下一步”按钮,刚才标蓝的语句被执行,蓝条向下移动,控制台有输出。
      下一步
      继续点击左下侧的“下一步”按钮。控制台没有输出。
      再下一步
      继续点击下侧的“下一步”按钮。观察现象。
      继续下一步
      继续点击左下侧的“下一步”按钮,直到程序运行完毕,观察现象。
  6. C语言的基本元素
    #include <stdio.h>
    
    int main(void)
    {
        printf("Hello World!\n");
        return 0;
    }
    

    这是我们刚才编写的Hello World程序。在我讲解之前,请您把前面设置的断点去掉(单击它即可),进行一些实验。请注意,每个实验相互独立(要控制变量),在一次实验完成后,请恢复成上面最初的Hello World程序,再进行下一个实验。如果遇到错误,可以检查自己的代码和实验的要求,重新实验,但不要超过三次,若超过则直接进行下一个实验。请务必留意Dev-C++提示的错误信息(错误提示)或者警告

    1. 将“#include <stdio.h>”改成“#include <stdlib.h>”,编译运行,观察现象。
    2. 将“#include <stdio.h>”改成“#include <stdoi.h>”,编译运行,观察现象。
    3. 在代码的第一行(“#include <stdio.h>”这一行)打上断点,编译运行,观察现象。
    4. 将“int main(void)”改成“int main()”,编译运行,观察现象。
    5. 将“int main(void)”改成“int begin(void)”,编译运行,观察现象。
    6. 将“int main(void)”改成“main(void)”,编译运行,观察现象。
    7. 将“Hello World\n”这个字符串改成“Hello CyCoder\n”,编译运行,观察现象。
    8. 去掉“printf(“Hello World!\n”);”后面的分号,变为“printf(“Hello World!\n”)”,编译运行,观察现象。
    9. 将“Hello World\n”这个字符串改成“Hello\nWor\tld”,编译运行,观察现象。
    10. 将“return 0;”改成“return 1;”,编译运行,观察现象。
    11. 去掉末尾的右花括号“}”,编译运行,观察现象。

    感谢您对我的信任,做完了这个实验。事实上,学习编程最好的方法就是实践。也许您的在刚才的一些实验中发生了一些莫名奇妙的错误,甚至根本无法运行(正常,我故意的);或者有的实验成功了,但您不知道为什么。您的心中一定充满疑惑,这是正常现象。像打疫苗一样,您在我的引导下犯了错,积累了解决错误的经验,之后遇到相似的错误,能很快的解决,这也是为什么我让您留意错误信息。关于您的疑问请容我慢慢道来。

    1. 预处理指令与头文件
      在C和C++语言中,#开头的代码,都是写给编译器(实际上是预处理器,但在本文中不做区分)的指令。“#include”指令,是告诉它,在编译之前,先包含stdio.h这个文件。
      什么是“包含”呢?函数,是C语言中非常重要的概念不同于指一段在一起的、可以做某一件事儿的程序(或者结构),printf()就是一种函数。stdio,指standard input and output,标准的输入输出,里面包含了一些C语言标准所规定的输入和输出的函数,printf()就是其中之一。通过“包含”这个stdio.h这个文件,我们可以使用(我们称之为调用)其中的printf函数,而不用自己去实现它。像stdio.h这样封装了公用的函数、模块等这样的文件,我们称之为头文件
      当然,您也可以自己编写头文件,自己包含自己的头文件。关于函数,您不需要有深入的了解,只需有一个感性的认识。头文件和函数的更多内容,您将会在之后的章节中学习。
    2. 主函数、return 0与花括号
      main(void)这个函数我们称之为主函数,它由操作系统调用。在标准C和C++语言中,主函数唯一且名字必须为“main”。这也是为什么您在调试的过程中,发现程序都是从主函数开始执行的。
      像数学中的函数那样,计算机函数也可以有值。倒数第二行的“return 0;”是主函数的返回值,返回值由操作系统处理,一般而言,0意味着程序正常退出。0是一个整数(integer)在C语言中,我们使用“int”这个关键字来表示整数。主函数的返回值是一个整数,所以我们采用“int main(void)”来声明主函数。
      函数括号后面的内容表示函数的参数(可以理解为自变量),主函数的参数是操作系统的一些调用信息,但我们不需要这个调用信息,即不需要这个参数,所以使用void,或者什么都不写表示我们不需要这个参数。具体如何使用这个参数,我们将在函数的章节中讲解。
      函数体我们使用花括号表示,花括号的内容是函数执行的步骤。花括号不一定要换行,可以写在与主函数后面的括号后。在这里可以通俗地理解为主函数的代码内容。函数就像一个菜谱,在Hello World程序中main是菜谱的名字。这个“菜谱”里面有菜谱的一些信息和菜肴制作方法。菜谱中可以使用佐料,制作佐料的方法可以参考另一个菜谱。在Hello World程序中,我们的“main”菜谱中“参考”了“printf”这个菜谱,帮我们做了一个参数为”Hello World\n”的佐料。这个知识点,我们将在函数的章节中具体讲解,您只需要知道,到目前为止,您的代码都在主函数的花括号中完成即可
      在C语言中,语句和语句之间,运算符与运算符之间、函数与函数之间,空行、空格和缩进大多数情况下不是必要的,但是它可以让您的程序变得更加美观,更有逻辑性和条理性。建议您在入门阶段养成良好的习惯,形成自己的代码风格,让您的代码美观、有条理,便于自己Debug和别人与您的合作。
    3. 分号
      分号是语句的结束,如果没有分号,是会报错的哟。
    4. printf
      在C语言中,我们使用双引号来表示一个字符串。’\’这个字符为转义字符,它与后面的字符结合,可以表示一些独特的符号。例如’\n’这个字符我们称之为换行符,在C语言的字符串中,它将输出一个换行字符。这也是为什么您在实验8中,看到了分开的两行输出。类似的,我们用’\\’输出一个反斜杠,用’\t’输出一个制表符等等。关于占位符的内容,您将和printf一起,在输入和输出这个章节中学习。
      printf()是一个函数,帮助我们在控制台中输出”Hello World\n”这个字符串。关于这个函数具体用法,您将会在输入和输出这个章节中学习。
    5. 注释
      实验12:
      将我们的Hello World代码,更换为以下代码,请编译并运行,观察输出:

      /* 
      这个程序是一个Hello World程序
      这个程序用于在控制台中输出Hello World语句
      */ 
      #include <stdio.h>  // 我是头文件 
      
      /* 我是主函数 
      程序的从我开始执行
      我很重要*/ 
      int main(void)      // 我是是主函数 
      {                   // 我是可爱的花括号 
          printf("Hello World!\n");       // 我是printf输出Hello World的语句 
          return 0;                       // 我是返回值
          // 程序到这里执行完啦(。^▽^) 
      }   // 我也是一个可爱的花括号,与第11行的花括号是一对哟(^U^) 
      // 我是文件的最后一行 
      

      运行结果
      我们发现我们添加的东西并没对程序造成什么影响。事实上,我们所添加的这些东西,被称之为“注释”,注释分为单行注释(由“//”打头)和多行注释(由“/*”开始,到“*/”结束)。注释的内容可以是对代码的一些说明,编译器会忽略注释,注释不参与编译,但能帮助程序的编写者更好地理解这个程序。强烈建议您养成对关键语句和代码的逻辑结构添加注释的好习惯。

    6. 执行顺序
      如果您认真完成了调试的任务,您应该已经意识到了,程序是自上而下地执行的。我们把按照解决问题的顺序写出相应的语句就行,自上而下,依次执行的结构称之为顺序结构(Sequence structure)。在这篇文章中,我们的程序都采用顺序结构。顺序结构是最简单的程序结构,也是最常用的程序结构。未来,您还将学习到分支结构和循环结构。
  7. 总结
    在这篇文章中,您学到了C语言的历史、C语言的用处、C语言开发工具的类型、C语言开发环境的安装和使用、C语言的基本要素及其功能、C语言注释的书写,感性地理解了C语言源代码是如何被编译执行的,理解了顺序执行结构,掌握了C语言初步的调试方法,写下了您第一个C语言程序。想必您一定收获满满吧。

  8. 习题

    1. 请阅读下面的程序,完成下面的五个问题:
      /**
       * 这个程序由FD创建于2019年8月10日 
       */
      #include <stdio.h>
      #include <stdlib.h>
      
      int main(void)
      {
          // 依次输出语句
          printf("Hello! ");
          printf("I am your friend!\n");
          printf("Can you understand my words?\n");
          return 0;   
      }
      
      1. 请您不运行程序,解释每一个语句的作用。
      2. 请您不运行程序,解释哪些语句是被编译器忽略的,哪些语句是预处理指令,哪些语句是可执行程序中执行的。
      3. 请您不运行程序,解释语句被执行的流程
      4. 请您不运行程序,预测程序的输出。
      5. 请您在开发环境中运行程序,通过调试的功能验证1~4问题的答案。
    2. 请您试着抛开这篇文章,独立使用C语言编程,输出一个任意一个段落。

  9. 参考文献

    1. C语言
    2. 编译
    3. 顺序结构
《C语言入门(一)——环境搭建与第一个C语言程序》有2条评论
    1. 既然VS这么好,想必您一定是在用Visual Studio吧😁?
      其实最主要的还是生(€)活(€)所迫(£),没办法的办法。
      正好我下定决心,不用Visual Studio Code,安装Dev-C++,才将安装过程整理成文。就入门而言,我更推荐Code::Blocks。

发表评论