个人理解,C语言的语句应该是描述处理逻辑的最小单位。比如将两数相加,进行一个判断,做出一个跳转。(这里只是整理时的说法,真正的语句大家可以到编译原理里面去寻找答案,一般语句是语法分析的最小单位。)
(一)基础语句
一些简单的记号合法组合而成,一般以“;”结束,比如下面这些都可以算作是语句。当一些列语句结合在一起时,就是语句块。C语言可以使用“{}”记号将语句块包起来,在函数、if_else、switch、for、while等处理里一般都会见到,有的是必须加"{}的。一般来讲,局部变量的作用域(生命周期)就在当前语句块,而全局变量则是所有语句块都能使用。
int a; // 定义一个变量a
a = b + c; // 将b和c相加并赋值给a
#define a 10 // 定义一个宏,编译时替换为10
goto label; // 跳转到label定义的位置
return; // 跳出当前函数处理
(二)条件语句
条件语句用于只有某些条件满足时才能执行的代码。比如,团队聚餐时,结账的总是管理团队经费的人,并不是所有人都需要结账。C语言的条件判断一般用if来表示或者if_else来表示,支持嵌套。
可以看如下代码,如果管钱,则先付帐再离开,如果不是,可以直接离开。
if(TRUE == IsMoneyManager) { // 如果是管钱的,需要先付钱。
PayForMeal();
}
LeaveTheRestaurant(); // 离开餐厅
但是如果不是管钱的,聚完餐其实一般不会直接离开,而是等管理团队经费的人把钱给了然后一起离开,用代码表述如下。
if (TRUE == IsMoneyManager) { // 如果是管钱的,需要先付钱。
PayForMeal();
} else { // 如果不是,那就先等一会儿
Wait();
}
LeaveTheRestaurant(); // 大家一起离开餐厅
当然,C语言的if else组合可以很复杂,以满足我们实现判断逻辑的需求,如下图所示。
if (a0) {
DoIt();
if (a0b0) {
if (a0b0c0) {
...
}
} else if (a0b1) {
} else if (a0b2) {
}
...
} else {
}
} else if (a1) {
...
}
...
} else {
}
但其实这样看着,会有很多的if else,如果我们给定一个分数(0-100),判定这个成绩所属等级(90-100,A;80-89,B;70-79,C;60-69,D;0-59,E。)这样的话,用if else会显得很烦琐,这里需要用到另一种条件分支语句switch,直接上例子说明。
int score = GetScore();
int score_level = score / 10;
char level = '-';
switch (score_level) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5: {
level = 'E';
break;
}
case 6: {
level = 'D';
break;
}
case 7: {
level = 'C';
break;
}
case 8: {
level = 'B';
break;
}
case 9:
case 10: {
level = 'A';
break;
}
default: {
level = 'X';
break;
}
}
可以看到switch语句逻辑清晰了很多。switch语句前面的括号里的score_level必须是一个整型数据。每一个case表示一个可能的情况,如果不使用break终止,那么前一个case执行完成后会执行后一个能匹配上的case里的语句。如果case都匹配不上且定义了default分支,那么执行default里的处理;如果没有定义default分支,那么直接终止switch相关处理。
(三)循环语句
循环语句的意思是,在一定条件成立时,重复执行一个语句块。C语言里的循环语句有for循环、while循环和do_while循环,同时if和goto语句相结合也能达到循环的效果。
先给出一个for循环的示例,计算1-100的算术和。
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
其中()中的以";"分隔的三个部分,有不同的逻辑控制意义。
“int i = 0;”表示循环初始化,这里将i的初始值设定成了1。
"i <= 100"表示循环执行条件,如果这条语句为真,则循环体将被执行,如果为假,则循环终止。
"i++"表示循环增量,其实是每次循环体执行完毕后,将执行该语句,这里是指每次将i的当前值加给sum变量后,将i的值加一。
而已"{}"包含起来的语句块,就是这个for循环的循环体,也就是每次被重复执行的主体部分。
for循环的要素比较多,“()”中就三个语句。相较下while语句要简单一些,同样计算1-100的算术和,while循环实现如下。
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i;
i++;
}
"()"中就是while循环的判断条件,只要条件为真,"{}"中的循环体就会被执行。
而do_while循环则和while循环有些微的差别,会至少执行一次循环体"{}"。计算1-100的算术和,do_while实现如下。
int sum = 0;
int i = 1;
do {
sum += i;
i++;
} while (i <= 100);
循环语句是可以嵌套的,for、while和do_while可以相互嵌套,也可以自身嵌套,从而构成多重循环。比如需要计算1-100,101-200和201-300的算术和。
int arr_sum[3];
for (int i = 0; i < 3; i++) {
start = i * 100 + 1;
end = (i + 1) * 100;
arr_sum[i] = 0;
for (int j = start; j <= end; j++) {
arr_sum[i] += j;
}
}
(四)跳转语句
跳转语句用于在C语言运行过程中,改变语句的执行顺序。有return、break、continue、goto四种。
return语句用于终止当前执行的函数,并返回调用这个函数的地方。return可以携带返回值,对应void类型函数,使用“return;”,对于有返回值的函数,使用“return result;”。这里result是要返回的值。
break语句用于终止switch_case、for、while和do_while语句的执行,即中途跳出当前层的前述四种语句。
continue语句用于跳过当前循环,被跳过的部分是从continue开始往后的循环体。
goto语句则是直接跳转到某个预定义好的标签,因为goto会破坏程序的结构化设计,所以现在很少使用。
这四种语句给出示例如下。
/* return语句 */
void nothing_to_do_function(int param)
{
if (1 == param) {
return; // 用于退出当前函数
}
param++; // 不退出会执行这条语句
}
/* break语句 */
int sum = 0;
for (int i = 1; i < 100; i++) {
if (sum > 1000) {
break; // 终止当前for循环,只计算到小于1000的最大和
}
sum += i;
}
/* continue语句 */
int sum = 0;
for (int i = 1; i < 100; i++) {
if (0 == (i % 5)) {
continue; // 求和里不包含所有能被5整除的数
}
sum += i;
}
/* goto语句 */
int i = 1;
int sum = 0;
start_label:
sum += i;
i++;
if (i <= 100) {
goto start_label; // 如果i没有超过100,那么从start_label再执行
}