这是一个C语言系列文章,如果是初学者的话,建议先行阅读之前的文章。笔者也会按照章节顺序发布。
在上一篇的示例中其实出现过很多表达式和语句,例如:
int a = 1 + 2;
其中,1 + 2是一个表达式, a = 1 + 2也是一个表达式, 而整个这句则是一个语句。
**表达式是一种由运算符和操作数组成的结构。**下面我们看一些表达式例子:
1 + 2 //加号为加法运算符,1和2为加法运算符相关的操作数
2 >> 1 //>>为右移运算符,2和1为运算符相关的操作数
func(1,2) //这是一个函数调用,初学者可以暂时不考虑什么是函数,我们将在后面介绍
//在这个例子中,可以将函数名与()看作运算符,而括号内的数为操作数。
//大家可以回看上一篇中运算符表中的括号运算符的使用形式。
每一个表达式都有一个表达式值。
例如1 + 2
,我们都知道等于3,3就是这个加法表达式的值。
再例如2 >> 1
,我们也知道等于1,1就是这个右移表达式的值。
最后看下func(1,2)
这样的表达式,它的值是函数func的返回值,初学者不必纠结于此。
上一篇我们介绍的运算符中有一个自加和自减的运算符,我们来看下例子:
int a = 10;
//下面这四个表达式的值和变量a的值分别是多少呢
++a //a的值11,表达式值11
a++ //a的值11,表达式值10
--a //a的值9,表达式值9
a-- //a的值9,表达式值10
可以看到,凡是自加/自减运算符在前的,a的值和表达式的值都是经过运算后的值,而运算符在后的,a的值是运算后的值,表达式的值则是运算前的值。
再来看一个上一篇的例子:
int a = (1,2,3);
其实,逗号运算符表达式中每一个被逗号隔开的部分都是一个子表达式,即:
int a = (1+2, 3+4, 5+6);
是完全符合语法要求的,而逗号表达式的值是最后一个子表达式的值(逗号运算符结合方向为左到右,所以是最右侧的),即11。
语句是C语言中的基本组成元素,一个C语言程序的源码必然是由语句组成的。
语句的形式有很多种,大致分为:
初学者对上面未听说过的内容不必纠结,我们后面会逐个专门介绍,这里只是进行一个汇总。
上面这8类中,除函数和循环控制类语句以外,其余均以分号做结尾的。
其中声明是告知编译器,这个变量、函数、结构体等在本文件内或者其他文件内有定义。
下面给出每种语句的一个样例,我们主要看表达式语句、变量相关语句,其余的粗略了解即可。
a = 1; //a=1是由赋值运算符组成的赋值表达式,在表达式后加一个分号,就变成了赋值语句。
a = 1 + 2; //1+2是加法运算符组成的加法表达式,其优先级高于赋值运算符,所以先计算加法
//加法表达式的值为3,然后是由等号组成的赋值表达式,表达式的值为3(即等号右侧表达式的值)。
//最后,在赋值表达式后增加一个分号,变成一条语句。
a = b = 1; //由于赋值表达式也有表达式值,因此可以使用这种写法同时给变量a和变量b赋值,他们的值都是1。
int a; //最基本的变量定义语句,并未给a赋初始值。
//定义语句包含了变量的类型、变量名和分号。
int a = 1;//增加了赋值表达式,给变量定义语句中的变量赋初始值。
static int a = 1; //static在此表示静态变量,后面章节我们会介绍到
int a; //声明变量a与定义写法一致
static int a; //声明本地变量a
extern int a; //声明外部变量a
int foo (int arg1, char arg2)
{
//...
return 0;
}
//定义返回值为整型的函数foo,且函数有两个参数——整型arg1和字符型arg2
int foo (int arg1, char arg2);//与定义类似,但是省略{}及其内容,并用分号结尾
int foo (int, char); //函数声明可省略参数名
static int foo (int, char); //声明本地函数
extern int foo (int, char); //声明外部函数
struct person {
char name[256];
int age;
};
//定义名为person的结构体,其中包含字符型数组name和整型变量age
static struct person; //声明本地结构体person
extern struct person; //声明外部结构体person
union volunteer {
struct person john;
struct person susan;
};
//定义名为volunteer的共同体,其中包含两个struct person对象john和susan。共同体中只能操作其中一个成员
enum identity {
teach,
student
};
//定义名为identity的枚举类型,其中含有teach和student成员。
static enum identity;
typedef struct person person_t; //定义类型person_t,其类型等价于结构体struct person
static person_t; //声明本地类型person_t
extern person_t; //声明外部类型person_t
for (i = 0; i < 10; ++i) {
//...
}//for循环语句
while (i < 10) {
//...
}//while 循环语句
do {
//...
} while (i < 3);//do-while循环语句
switch (c) {
case 'a':
//...
break;
case 'b':
//...
break;
default:
//...
break;
}//switch语句
if (i < 10) {
//...
} else {
//...
}//if-else语句
忽略本小节内容并不影响后续C语言的学习和使用。