C语言之一:基础知识

xeonds

2020.12.17 13:26:00

大家好啊,今天我就和大家聊一聊C语言程序的编写。

首先的首先,请一定记得将你的输入法调至英文模式,确保你输入的符号是半角符号。不然,你就掉进了初学者的第一个大坑:符号的大大大大大大大大大大大大大大大大坑!

那么我们正式开始。首先,我们来看一个例子。

//Example-1-1-Hello,World!

#include <stdio.h>
int main(void)
{
    int year=2020;
    /* 我的第一个 C 程序 */
    
    printf("Hello, World %d!\n",year);

    return 0;
}

这就是一个C程序的源代码。如果想让它运行起来,我们得把它编译成为可执行程序。这个“编译”的过程,就像是翻译:你用的是C语言,电脑却只能听得懂二进制语言,要让电脑听得懂,你就必须把你写的源码“翻译”成电脑能认识的二进制代码。这个工作的完成,需要借助于“编译器”的功能。

你可能会想了:既然还要翻译一遍,为什么不直接用“二进制语言”来写程序呢?这个“翻译官”会不会把我写的代码翻译错啊?首先,你当然可以用二进制来直接编写程序。但是这有两个缺点:第一个,你的开发效率会非常低。第二个,你的源代码非常不便于修改和阅读。你想想,屏幕上只有一大片0和1,你肯定得看好长一阵子才能弄明白这是什么意思——哪怕它是你自己写的也一样。所以汇编语言就诞生了。但是它太过于抽象,而且可移植性也不是很强,所以还是得高级语言来干写程序的活——我们现在用的C语言就是高级语言。当然,这个“高级”不是说汇编语言不好,而是说相对于汇编语言直接操作底层,C语言是在软件层面操作的。其次,这个“翻译官”不会出错,因为它是按照你写的源码“字字对译”的。所以,如果出错,那一般是源码中出现错误(也就是bug)。

那么,我们现在就需要安装一个编译器。在Windows平台上,我们常用的编译器是Mingw。要使用它,我们需要用命令行操作——太麻烦了,所以我们一般用IDE(集成开发环境)这里我推荐大家用Dev-cpp(点击下载)。当然,有能力的同学也可以尝试用VS Code搭建C语言开发环境。

安装好之后,先在你的电脑里新建一个文件夹,专门用来放置源代码和程序。然后,打开Dev-cpp,新建一个文件,并保存在刚才的文件夹(下文称作“工作区”),然后在里面输入上面的源码。最后,点击运行,按照提示操作就可以。嗯,差不多就是这样了。

你会看到屏幕上出现了一个黑框,可能是一闪而过的。如果是这样的话,请在return 0;的前面加上一行:

getchar();

现在再看看,黑框里是不是出现了Hello,World!呢?如果是,那么恭喜你,你写出了你的第一个C语言程序。

好,让我们回过头来,看看这段源代码里都是什么。

整个程序结构明显,由两大块构成。第一块是以#开头的那一行,第二块则是int main(void)和后面花括号所包住的一块。我们把第一块叫做“预处理指令”,第二块叫做“main函数”。绝大多数程序都由这两大块构成。

「预处理指令和预处理器」

预处理器就是用来处理预处理指令的工具。C 预处理器(C Preprocessor)不是编译器的组成部分,但是它是编译过程中一个单独的步骤。换句话说,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处在这个例子中,C预处理器将用名为stdio.h的文件内的所有内容替换这一行指令(很像复制粘贴吧)。

所有的预处理器命令都是以井号(#)开头。它必须是这一行指令的第一个非空字符,为了增强可读性,预处理器指令应从第一列(也就是这一行的开头)开始换句话说,预处理指令前最好不要留空格。目前我们接触到的预处理指令只有#include一个,它的作用就是内容替换。后面我们还会接触更多。

「main()函数」

函数是一组一起执行一个任务的语句。函数是构成C程序的基本模块。每个C程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

main()在c语言里,是一个程序的起点。一个程序一般会从main()里的第一行语句开始执行,一直到最后一行的return()函数结束程序。的确,main是一个极其普通的名称,但是这是唯一的选择。C程序一定从main()函数开始执行(目前不必考虑例外情况)。除了main()函数,你可以任意命名其他函数,而且main()函数必须是开始的函数。那一对圆括号是用于识别main()是一个函数。main前的int则是main()函数的返回类型。int表明main()函数返回的值是整数。返回到哪里?操作系统。后面我们会细说这个问题。

「注释」

在程序中,被/**/两个符号括起来的部分是程序的注释。写注释能让他人(包括自己)更容易明白你写的程序。由//符号开头的一行也是注释。下面是一些有效注释的例子:

/*我是注释。*/

//巧了我也是。

/*我也是注释,
不过被分成两行。*/

/*
我还是注释。
*/

「花括号、函数体和块」

在main()函数后面跟着一对花括号,里面框着main()函数的所有语句,这些语句合称函数体。一般而言,所有的C函数都使用花括号标记函数体的开始和结束。这是规定,不能省略。只有花括号能起这种作用,圆括号(())和方括号([])都不行。

花括号还可以用来把函数的多条语句合并为一个单元或块。如果你熟悉 Pascal, ADA, Modula-2或者 Algol(不过估计大家都没听过,毕竟是很老的东西……记得没错的话,ADA都是上世纪50年代的东西了),就会明白花括号在C语言中的作用相类似于这些语言中的begin和end。

「声明」

程序中有这么一行:

int year=2020;

这是一句声明语句,声明了一个int(整数)类型的,叫做year的变量。int是C语言的一个关键字,也就是说,你在给你的函数,变量之类的东西命名时,你必须避免使用这个名称。year则是一个标识符,也就是一个变量、函数或其他实体的名称。所以,声明,就是把一个标识符和计算机内存中的一个特定位置联系起来,同时也确定了储存在某位置的信息类型或数据类型。

C语言的一个很重要的特性就是,所有的变量必须先声明才能使用。并且,声明要放到块的顶部。另外,C语言的标识符在命名时,只能用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第一个字符不能是数字。另外,在C语言中,只有大小写不同的两个标识符是不同的,即“大小写敏感”。比如,STARS,Stars,stars就是三个不同的标识符。在声明标识符的时候,应该有明确的含义,就像例子中的year,能让人一眼看出这个变量是存储年份的。另外,关于标识符的长度限制,一般的标识符长度是63个字节,而外部标识符的长度是31个字节(外部标识符后面会解释)。总之,在命名标识符时,要做到简洁明了。

「printf()函数和scanf()函数」

printf()函数是格式化输出函数, 一般用于向输出设备按规定式样输出消息(比如显示遗传字符)。printf()函数的语法为:

printf("格式化字符串",参数表);

其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出;另一部分是格式化规定字符, 以”%“开头, 后跟一个或几个规定字符, 用来确定输出内容式样(比如本例中的%d就是。其实说通俗一点,这些就是占位符,表示这里要输出一个数字,具体是多少要在后面的参量表里找)。参量表是需要输出的一系列参数, 其个数务必与格式化字符串所阐明的输出参数个数一样多(就是前的%开头的占位符数量必须和后面的参量数量一样多), 各参数之间用”,“分开, 且顺序逐一对应,不然将会出现意想不到的过失。

常用的格式化规定字符还有:%s(字符串),%f(小数,也称作浮点数),%c(单个的字母)等等。另外格式化字符串中还会出现制表符,比如,,我们会在后面详细说。

scanf()函数大致类似,下面我举一个例子。

//Example-2-Print&Scan

#include <stdio.h>
int main(void)
{
    int age; //声明一个叫做age的整型变量

    printf("Input your age:",year);
    scanf("%d",&age);
    printf("You are %d years old!",age);

    return 0;
}

可以看出,scanf()的用法和printf差不多,只不过在要赋值的变量名前要加上&符号(解引用符号,具体在指针中会讲到)。

那么第一次教程就是这样了。如你所见,东西确实不少,因为我想用尽可能短的篇幅帮大家入门C语言编程,感受C的快乐,而又限于个人水平,最后就写成了这样。如果有不完善的地方欢迎指出,谢谢。