3.1 语句与程序块
在x=0、i++这样的表达式之后加上一个分号(;),它们就变成了语句。C语言中,分号是语句结束符。
用一对花括号{}把一组声明和语句括在一起就构成了一个复合语句(也叫做程序块),复合语句在语法上等价于单条语句。函数体中被花括号括起来的语句便是明显一例。
if、else、while与for之后被花括号括住的多条语句也是类似的例子(任何程序块中可以声明变量)。
右花括号用于结束程序块,其后不需要分号。
3.2 if-else语句
用于条件判定:语法如下:
if(表达式):
语句1;
else
语句2;
其中else部分是可选的。
该语句执行时,先计算表达式的值,如果其值为真(即表达式的值为非0),则执行语句1;
如果其值为假(即表达式的值为0),并且该语句包含else部分,制性质语句2;
另,有些情况下if-else可能语义不清。
以为if-else语句的else部分是可选的,所以在嵌套的if语句中省略它的else部分将导致歧义。
解决的方法是:将每个else与最近的前一个没有else配对的if进行匹配。
#include<stdio.h>
main() {
int a = 1;
int b = 1;
if (a > 0)
if (b > 0)
printf("a>0 and b>0");
else
printf("a>0 but b<0");
}
else部分与内层的if匹配,通过缩进结构也可以看处理。
如果这不符合我们的意图,则必须使用花括号强制实现正确的匹配关系。
#include<stdio.h>
main() {
int a = 1;
int b = 1;
if (a > 0) {
if (b > 0)
printf("a>0 and b>0");
}else
printf("a<=0");
}
3.3 else-if语句
结构如:
if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else
语句
(1)这种if语句序列是编写多路判定最常用的方法。
其中的各表达式将被依次求值,一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。
(2)同样,其中的语句可以是单条语句或者花括号括住的复合语句。
(3)最后一个else部分处理“上述条件均不成立”的情况或者默认情况。
有时候并不需要针对默认情况执行显式的操作,此时,可以把else部分省略掉。
该部分也可以用来检查错误,以捕获“不可能”的条件。
通过折半查找来进行演示使用:
#include<stdio.h>
main() {
int low = 0;
int high = 9;
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b = 7;
int v = 0;
v = (low + high) / 2;
for(;low <= high; v = (low + high) / 2) {
if(b == a[v]) {
printf("%d---%d----%d\n", b, a[v], v);
break;
} else if (b > a[v]) {
low = v;
} else if (b < a[v]) {
high = v;
}
}
return v;
}
3.4 switch语句
多路判定语句。它测试表达式是否与一些常量整数值中的某一个值匹配,并执行相应的分支动作。
switch(表达式){
case 常量表达式:语句序列
case 常量表达式:语句序列
case 常量表达式:语句序列
default:语句序列
}
(1)每一个分支都由一个或多个整数值常量或常量表达式标记。
如果某个分支与表达式的值匹配,则从该分支开始执行。各分支表达式必须互不相同。
(2)如果没有哪一分支能匹配表达式,则执行default的分支。default分支是可选的。
(3)如果没有default分支也没有其他分支与表达式的值匹配,则该switch语句不执行任何动作。
(4)各分支及default分支的排列次序是任意的。
程序例子如下:
==============
break语句使程序的执行立即从switch语句中退出。
(1)在switch语句中,case的作用只是一个标号,因此,某个分支中的代码执行完后,程序将进入下一个分支继续执行,除非在程序中显示得跳转。
跳出switch语句最常用的办法:使用break或者return。
(2)依次执行各分支的做法有优点也有缺点。
好的一面是它可以把若干个分支组合在一起完成一个任务,如上例中对数字的处理。
但是,正常情况下为了防止直接进入下一个分支执行,每个分支后必须以一个break语句结束。
从一个分支直接进入下一个分支执行的做法并不健全,这样做在程序修改时很容易出错。
除了一个计算需要多个标号的情况外,尽量减少从一个分支直接进入下一个分支这种用法。
(2)一种良好的程序设计风格,在switch语句最后一个分支的后面也要加上一个break语句。这样做逻辑上没有必要,但当我们需要向该switch语句后添加其他分支时,这种防范措施会降低犯错误的可能性。
3.5 while循环与for循环
while循环语句:
while(表达式)
语句
首先求表达式的值,如果值为真,执行语句,并再次求该表达式的值。
这一循环过程一直进行下去,直到该表达式的值为假,随后继续执行语句后面的部分。
for 循环语句:
for (表达式1;表达式2;表达式3)
语句
等价于下列while语句:
表达式1
while(表达式2){
语句;
表达式3;
}
但,当while或for循环语句中包含continue语句时,上述二者之间就不一定等价了。
(1)
for循环的3个组成部分都是表达式,一般,表达式1和表达式3是赋值表达式或者函数调用。表达式2是关系表达式。
3个组成部分的任何部分都可以省略,但分号必须保留。
如果在for循环中省略表达式1和表达式3,就退化成了while循环语句。
如果省略测试条件,即表达式2,则认为其值永远是真值,因此,下列for循环语句:
for(;;) {
}
是一个“无限”循环语句,这种语句需要借助其他手段(如break语句或return语句)才能终止执行。
是选择while还是for循环,取决于程序设计人员的个人偏好。
while((c = getchar()) == '' || c == '\n' || c == '\t')
;
因为其中没有初始化或重新初始化操作,所以使用while循环语句更自然一些。
如果语句中需要执行简单的初始化和变量递增,使用for语句更合适一些,它将循环控制语句集中放在循环的开头,结构更紧凑、更清晰。
3.6 do-while循环
3.7 break语句与continue语句
3.8 goto语句与标号