欢迎来到我的博客!💃💃
🏡🏡博客主页:August_._一起持续学习,不断总结,共同进步🎊🎊
文章目录
if 语句
1、复合语句
注意,在 if 语句中,语句是一条语句而不是多条语句:
if (表达式)语句
如果想用 if 语句处理两条或更多条语句,可以引入复合语句——由一对花括号,以及花括号内的声明和语句混合而成。通过在一组语句周围放置花括号,可以强制编译器将其作为一条语句来处理。
2、else 子句
if 语句可以有 else 子句:
if (表达式) 语句
else 语句
如果圆括号内的表达式的值为0,那么就执行 else 后边的语句。
下面是一个含有 else 子句的 if 语句的示例:
if (i>j) max = i;
else max = j;
注意,两条"内部"语句都是以分号结尾的。
C 语言对可以出现在 if 语句内部的语句类型没有限制。可以在 if 语句内部嵌套其他 if 语句,例如:
if (i > j)
if (i > k) max=i;
else max=k;
else
if (j > k) max=j;
else max=k;
注意,把每个 else 同与它匹配的 if 对齐排列,这样做很容易辨别嵌套层次。如果发现嵌套仍然很混乱,那么可以为语句增加花括号(即使有时并不是必需的)。
使用花括号有两个好处
- 很容易添加更多的语句到任何 if 或 else 子句中,程序变得更容易修改;
- 在向 if 或 else 子句中增加语句时避免由于忘记使用花括号而导致错误。
3、级联式 if 语句
级联式 if 语句的书写形式:
if(表达式)
语句
else if(表达式)
语句
...
else if(表达式)
语句
else
语句
编程时常常需要判定一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式” if 语句常常是编写这类系列判定的最好方法。
例如,这个级联式 if 语句用来判定 n 是小于0、等于0,还是大于0:
if (n<0)
printf(" 1\n ");
else if (n==0)
printf(" 0\n ");
else
printf(" 2\n ");
当然,这种格式中的最后两行( else 语句)不是总出现的,这种缩进级联式 if 语句的方法避免了判定数量过多时过度缩进的问题。
4、“悬空else”的问题
当 if 语句嵌套时,千万要当心著名的"悬空 else "的问题。思考下面这个例子:
if (y!=0)
if (x!=0)
result = x / y;
else
printf (" 0\n ");
C 语言遵循的规则是 else 子句应该属于离它最近的且还未和其他 else 匹配的 if 语句。在此例中, else 子句实际上属于最内层的 if 语句,因此正确的缩进格式应该如下所示:
if (y!=0)
if (x!=0)
result = x / y;
else
printf (" 0 \n ");
为了使 else 子句属于外层的 if 语句,可以把内层的 if 语句用花括号括起来:
if (y!=0){
if (x!=0)
result = x / y;
)
else
printf (" 0 \n ");
5、条件表达式
C 语言提供了一种特殊的运算符,允许表达式依据条件的值产生两个值中的一个。
表达式1? 表达式2:表达式3
//如果表达式1成立,那么表达式2,否则表达式3
表达式1、表达式2和表达式3可以是任何类型的表达式,这是 C 运算符中唯一 一个要求3个操作数的运算符。因此,它通常被称为三元( ternary )运算符。
条件表达式求值的步骤如下:
- 计算出表达式1的值
- 如果此值不为零,那么计算表达式2的值,并且计算出来的值就是整个条件表达式的值
- 如果表达式1的值为零,那么表达式3的值是整个条件表达式的值
下面的示例对条件运算符进行了演示:
int i=1, j=2, k;
k = i>j? i:j; // k=2
k = ( i>=0? i:0) + j; // k=3
这里一定要加上括号,因为除赋值运算符以外,条件运算符的优先级低于其他运算符。
条件表达式也普遍用于某些类型的宏定义中, printf 函数的调用有时也会得益于条件表达式,例如:
if ( i > j )
printf ("%d \n ", i );
else
printf ("%d \n ", j );
// 可以简化为
printf ("%d \n ", i > j ? i : j );
switch 语句
在日常编程中,常常需要把表达式和一系列值进行比较,从中找出当前匹配的值。因此,C语言提供了等价于级联式 if 语句的switch语句。
最常用的格式如下:
switch (表达式){
case 常量表达式:语句
…
case 常量表达式:语句
default:语句
}
注意:
- C 语言把字符当成整数来处理,因此在 switch 语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。
- 常量表达式不能包含变量和函数调用。因此, n +10不是常量表达式(除非 n 是表示常量的宏)
- 分支标号中常量表达式的值必须是整数(字符也可以),后边可以跟任意数量的语句,并且不需要用花括号把这些语句括起来
- 每个分支标号的,每组语句的最后一条通常是 break 语句
switch (grade) {
case 0:
printf (" 0 ");
break ;
case 1:
printf (" 1 ");
break ;
case 2:
printf (" 2 ");
break ;
case 3:
printf (" 3 ");
break ;
case 4:
printf (" 4 ");
break ;
default :
printf (" 5 ");
break ;
}
C 语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。
case 后边只可以跟随一个常量表达式。但是,多个分支标号可以放置在同一组语句的前面:
switch (grade){
case 4: case 3: case 2: case 1:
printf (" 1 ");
break ;
case 0:
printf (" 0 ");
break ;
default:
printf (" 5 ");
break ;
}
switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和
任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。
while 语句
while 语句的格式如下所示:
while (表达式)语句
执行 while 语句时,先判定控制表达式,再执行循环体会持续进行,直到控制表达式的值变为零才停止。例如:
i = 1;
while ( i < n )
i = i * 2;
注意,只有在控制表达式 i < n 为真的情况下循环才会继续。当表达式值为假时,循环终止,并且此时 i 的值是大于或等于 n 的。
无限循环
如果控制表达式的值始终非零, while 语句将无法终止。因此可以用非零常量作为控制表达式来构造无限循环:
while (1) …
除非循环体中含有跳出循环控制的语句( break 、 goto 、 return )或者调用了导致程序终止的函数,否则上述形式的 while 语句将永远执行下去。
do 语句
事实上, do 语句本质上就是 while 语句,只不过其控制表达式是在每次执行完循环体之后进行判定的。
格式如下所示:
do {
语句
} while(表达式);
do 语句的循环体必须是一条语句(也可以用复合语句),并且控制表达式的外面也必须有圆括号。执行 do 语句时
- 先执行循环体,再计算控制表达式的值
- 如果表达式的值是非零的,再次执行循环体,然后再次计算表达式的值
- 在循环体执行后,若控制表达式的值变为0,则终止 do 语句的执行。
for 语句
1、语法
格式如下所示:
for (声明或者表达式1;表达式2;表达式3)语句
例如:
for (i=10; i>0; i--)
printf (" It's %d \n ", i );
实上,除了一些极少数的情况以外, for 循环总可以用等价的 while 循环替换:
表达式1;
while(表达式2) {
语句
表达式3;
}
- 表达式1是循环开始执行前的初始化步骤,只执行一次;
- 表达式2用来控制循环的终止(只要表达式2的值不为零,循环就会持续执行);
- 表达式3是每次循环中最后被执行的一个操作
研究等价的 while 语句有助于更好地理解 for 语句。例如,假设把先前的 for 循环示例中的 i - -替换为 - - i :
for ( i=10; i>0; --i )
printf (" It's %d \n ", i );
这样做会对循环产生影响呢?研究等价的 while 循环就会发现,这对循环没有任何影响:
i = 10;
while ( i > 0){
printf (" It's %d \n ", i );
--i;
}
2、在 for 语句中省略表达式
通常 for 语句用三个表达式控制循环,但是有一些 for 循环可能可以省略任意或全部的表达式。
注意:
即使省略掉某些表达式,控制表达式也必须始终有两个分号。
如果省略了 for 语句中的第三个表达式,循环体需要确保第二个表达式的值最终会变为假。
当 for 语句同时省略掉第一个和第三个表达式时,它和 while 语句没有任何分别。例如,
for (; i>0; )
printf (" It's %d \n ",i--);
//等价于
while (i>0)
printf (" It's %d \n ",i--);
这里 while 语句的形式更清楚,因此也更可取。
如果省略第二个表达式,那么它默认为真值,因此 for 语句不会终止(除非以某种其他形式停止)。例如,可以用下列 for 语句建立无限循环:
for ( ; ; ) ...
3、逗号运算符
格式如下所示:
表达式1,表达式2
这里的表达式1和表达式2是两个任意的表达式。计算主要通过两步来实现:
- 计算表达式1并且扔掉计算出的值;
- 计算表达式2,把这个值作为整个表达式的值
逗号运算符的优先级低于所有其他运算符,所以不需要在++ i 和 i + j 外面加圆括号。
逗号运算符允许将两个表达式"粘贴"在一起构成一个表达式。其中 for 语句是唯一可以发现逗号运算符的地方。例如,假设在进入 for 语句时希望初始化两个变量:
sum = 0;
for (i=1; i <= N ; i++)
sum += i ;
//改写为
for (sum=0, i=1; i <= N ; i++)
sum += i ;
表达式 sum =0, i =1首先把0赋值给 sum ,然后把1赋值给 i 。利用附加的逗号运算符, for 语句可以初始化更多的变量。
退出循环
1、break语句
break 语句把程序控制从包含该语句的最内层 while 、 do 、 for 或 switch 语句中转移出来。因此,当这些语句出现嵌套时, break 语句只能跳出一层嵌套。
例如: switch 语句嵌在 while 语句中的情况
while (...){
switch (...){
...
break ;
...
}
}
break 语句可以把程序控制从 switch 语句中转移出来,但是不能跳出 while 循环。
2、continue 语句
continue 语句会把程序控制留在循环内,并且continue 语句只能用于循环。
例如:无论何时读入数0都执行 continue 语句,控制将跳过循环体的剩余部分,但仍留在循环内。
n = 0;
sum = 0;
while (n<10){
scanf ("%d",&i);
if (i==0) continue ;
sum += i ;
n++;
}
3、goto 语句
goto 语句可以跳转到函数中任何有标号的语句处。
【C99增加了一条限制: goto 语句不可以用于绕过变长数组的声明】
标号只是放置在语句开始处的标识符:
标识符:语句
goto 语句的格式如下:
goto 标识符;
语句必须和 goto 语句在同一个函数中。