一、什么是语句?
语句(statement)是C程序的基本构建块,一条语句相当于一条完整的计算机指令。在C中,大部分语句都以分号结尾。
C语句可分为以下五类:
1、表达式语句
C程序设计语言的表达式语句由表达式加上分号“;”组成。
注意:表达式语句也可以只由一个“;”分号组成,称为空语句,空句可以用于等待某个事件的发生,特别是用在while循环语句中。空语句中还可以用于为某段程序提供标号,表示程序的执行位置。
2、函数调用语句
函数调用语句由函数名、实际参数加上分号“;”组成。
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。
3、控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
条件判断语句也叫分支语句:if语句、switch语句;
循环执行语句:while语句、do while语句、for语句;
转向语句:break语句、goto语句、continue语句、return语句。
二、分支语句(选择结构)
if语句
if语句被称为分支语句(branching statement)或选择语句(selection statement),因为它相当于一个交叉点,程序要在两条分支中选择一条执行。
单分支
if(表达式)
{
语句;
}
双分支
if(表达式)
{
语句1;
}
else
{
语句2;
}
多分支
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
表达式(expression)由运算符和运算对象组成。C表达式的一个最重要特性是每个表达式都有一个值。要获得这个值,必须根据运算符优先级规定的顺序来执行操作。那么,表达式 q>3 的值是多少?
这种关系表达式的值不是0就是1。在C语言中,0表示假,非0表示真。如果对expression求值为真(非0),则执行statement;否则,跳过statement。概括地说,可以使用任意表达式,表达式的值为0则为假。
悬空 else
首先,大家先看下下面的代码,然后思考一下打印的结果是什么?
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
是不是第一感觉是打印 hehe ,但仔细一看,奥奥~~,原来打印的是 haha 呀!
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
这样是不是一眼就看出来呢!
ATTENTION
else的匹配:else是和它离的最近的if匹配的。
代码排版很重要,在写if和else一定后要接个花括号’{ }‘
当变量和常量比较是否相等时,最好写成 5 == num 这样的形式,可以防止将赋值和相等的符号弄混。这样,即使弄混了编译器也会报错。
switch语句
使用条件运算符和 if else 语句很容易编写二选一的程序。然而,有时程序需要在多个选项中进行选择。可以用 if else if...else 来完成。但是,大多数情况下使用switch语句更方便。
形式:
switch (expression)
{
case label1 :
statement 1;
case label2 :
statement 2;
default :
statement 3;
}
程序根据 expression 的值跳转至相应的 case 标签处。然后,执行剩下的所有语句,除法执行到 break 语句进行重定向。expression 和 case 标签都必须是整数值(包括 char 类型),标签必须是常量或完全由常量组成的表达式。如果没有case 标签与expression 的值匹配,控制则转至标有default 的语句(如果有的话);否则,将转至执行紧跟在switch 语句后面的语句。
switch(整型表达式)
{
case 整型常量表达式;
语句;
}
注意:case标签后必须是整型且为常量表达式
switch后的括号内必须是整型表达式
break语句在其中起什么作用?
它让程序离开switch语句,跳至switch语句后面的下一条语句。如果没有break语句,就会从匹配标签开始执行到switch末尾。如果break语句位于嵌套循环内,它只会影响包含它的当前循环。break语句还可用于因其他原因退出循环的情况。
三、程序跳转
关键字:break、continue、goto
这三种语句都能使程序流从程序的一处跳转至另一处。
break语句:
所有的循环和switch语句都可以使用break语句,它使程序控制跳出当前循环或switch语句的剩余部分,并继续执行跟在循环或switch后面的语句。
continue 语句:
所有的循环都可以使用continue语句,但是switch语句不行。continue语句使程序控制跳出循环的剩余部分。对于while和for循环,程序执行到continue语句后会开始进入下一轮迭代,对于do while循环,对出口条件求值后,如有必要会进入下一轮迭代。
goto语句:
goto语句使程序控制跳转至相应标签语句。冒号用于分隔标签和标签语句,标签名遵循变量命名规则。标签语句可以出现在goto的前面或后面。
下面,展示一个使用goto语句的一个关机程序:
#include<stdio.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
小结:
何时使用switch?何时使用if else?你经常会别无选择。
如果是根据浮点型类型的变量或表达式来选择,就无法使用switch。
如果是根据变量在某范围内决定程序流的去向,使用switch就很麻烦,这种情况用if就很方便。
四、补充
C提供条件表达式(conditional expression)作为表达if else语句的一种便捷方式,也成为三目运算符。条件表达式的通用形式如下:
expression1 ? expression2 : expression3
如果expression1 为真(非0),那么整个条件表达式的值与expression2 的值相同;
如果expression1为假(0),那么整个条件表达式的值与expression3 的值相同。
智能的一个方面是,根据情况作出相应的响应。所以,选择语句是开发具有智能行为程序的基础。C语言通过if、if else、和switch语句,以及条件运算符( ? :)可以实现智能选择。