C语言的基础
任何事物的运行离不开两个部分,一个部分是“事物”,一个部分是“运行”,前者是状态,在C语言中表现为常量、变量等,后者是过程,在C语言中表现为语句、函数等。
语言是表达的工具,C语言也不例外,它是人告诉编译器的“语言”,然后编译器把它转化为汇编语言,汇编语言就是编译器告诉电脑的“语言”,我们用C语言写成的文件就叫代码,编译器翻译后的文件就叫程序。编译器把代码翻译成程序分为三个过程:预处理、编译和链接。有了程序,人就可以与电脑进行交互了,人对电脑说的“话”就叫输入,电脑对人说的“话”就叫输出。
无规矩不成方圆,接下来我们就说说C语言编程的“规矩”。
任何语言都是线性结构的,不论我们大脑里想的东西有多么地复杂,我们嘴上说的话都只能一个字一个字地吐出来,用C语言写的代码同样也是一维的,可能很多人不屑这么一个事实,在编译原理中,所有文法的分析都离不开这么一个基本事实,我们在写代码时也不知不觉地线性化。先来看一个简单的例子:
如果把整个程序比作是一条“线”,那么这条“线”首先要有一个入口,这个入口就是main函数的调用("main(agc, argv);"),一直到return语句(或者exit函数)的执行("return 0;"),我们就离开了程序,这就是整条“线”的“线头”和“线尾”,准确地说是线头的“珠子”和线尾的“珠子”,中间串起来的“珠子”就是一条一条的语句,这就是程序的基本框架。
开头的#include是预处理指令,预处理指令对应的是“预处理”阶段,语句对应的是“编译”阶段,说白了,预处理指令是为语句服务的,就比方说,这里的"#include <stdio.h>",它引入了scanf函数和printf函数的定义,这样我们才能使用scanf函数调用和printf函数调用的语句。
最基本的语句有运算语句、控制语句和输入/输出语句(函数调用的一种),分述之:
(1) 运算语句
基本的数据类型都是数字类型,有整数类型、实数类型和复数类型三种,布尔类型(_Bool)和字符类型(char)本质上是枚举类型(enum),而枚举类型本质上又是整数类型。不同的类型有不同的格式和长度,整数分为自然数(unsigned)和整数(默认),也分为short(16位)、int(32位或64位)和long(64位),实数分为float(32位)、double(64位)和long double(128位),复数分为float _Complex(64位)、double _Complex(128位)和long double _Complex(256位)。我们也可以用typedef语句定义新的类型,但只是给原有的数字类型取了一个昵称罢了。
数量分为常量和变量两种,常量是不变的,如1.23,变量是变化的,如x,如果常量是一个具体的物体,那么变量就是一个装载该物体的箱子,它可以存储任何一个常量。变量需要声明其类型,而常量一看便知,无需指定。表达式是把常量或变量通过运算符粘合起来的东西,运算符是一种符号化的“函数”,它借鉴了数学运算的表达方式,大大地简化了算术运算、关系运算、逻辑运算等数学运算的输入。赋值语句的左边是变量,右边是表达式,自增运算符++和自减运算符--本质上就是赋值语句。
(2) 控制语句
控制语句是非常重要的,如果没有他,一条“直线”是很难玩出什么花式出来的,它使得当前的运行能够在程序上来回跳转,大大地简化了重复的描述,增强了C语言的描述能力,就连后面要讲的函数本质上也是一种跳转。控制语句分为有条件的与无条件的,有条件的分为选择语句和循环语句,选择语句的鼻祖是if语句,在此基础上延伸出了switch语句,而循环语句的鼻祖是while语句,在此基础上延伸出了do语句和for语句,无条件的就叫跳转语句,跳转语句的鼻祖是goto语句,在此基础上延伸出了break语句、continue语句和return语句,break和continue主要是为了循环语句设计的,而return语句是为了跳出函数而设计的,还有一个exit函数是为了跳出整个程序而设计的。
(3) 输入/输出语句
暂且只需知道标准输入函数scanf和标准输出函数printf即可。