01.3.1 选择语句(if-else)
1 关系表达式和逻辑表达式
程序员控制程序执行逻辑运算需要选择和循环结构,涉及关系表达式与逻辑表达式。算术运算符的优先级高于关系运算符、关系运算符的优先级高于逻辑与和逻辑或运算符、相同优先级的运算符从左至右进行结合等,那么表达式5>3&&8<4-!0的最终值是多少?
其计算过程如下图所示。
![5>3&&8<4-!0 的计算过程](https://i-blog.csdnimg.cn/direct/7d50ad74d5e7406ea2a1ee71113d57c1.png)
2 if-else语句
在你打开衣柜拿出最上面的一件衣服时,你会判断这件衣服是不是你想穿的。如果是,那么你就会穿上;如果不是,那么你就会去找其他衣服。在计算机中,我们用if判断语句来实现这样的效果:if判断条件(表达式)为真,就执行某个语句,反之不执行这个语句。当然,也可以if 判断条件(表达式)为真,就执行某个语句,反之用 else 分支执行另一个语句,具体流程如下图1和图2所示。
【李】判断输入值是否大于0
![](https://i-blog.csdnimg.cn/direct/a8a05b9708114c31aa2a51d8fd3ae623.png)
当输入值大于0时,打印“i is bigger than 0”,当输入值小于等于0时,打印“i is not biggerthan 0”。
【例】判断输人值是否大于0
#include <stdio.h>
//选择语句if-else
int main() {
int i;
while(scanf("%d",&i))
{
if(i>0) //if下面加一个大括号
{
printf("i is bigger than 0\n");
}
else
{
printf("i is not bigger than 0\n");
}
}
return 0;
}
注意:在这个例子中,if 后面不能加分号,因为如果有 else分支语句,那么加分号会导致编译不通过;如果没有 else 分支语句,那么加分号会导致i无论取何值,都会打印“i is bigger than 0”。
运行结果
if 语句和 else 语句也可以多个同时使用(多分支语句),如下图3所示。但是,无论有多少个 if 语句或 else if 语句,程序都只会执行其中的一个语句。
同时,if 语句也支持多层嵌套,在 if 语句中又包含一个或多个 if 语句称为 if 语句的嵌套,如图4所示。
![](https://i-blog.csdnimg.cn/direct/82d40fb04bd44a848edbfe0df5080ee9.png)
注意:if 和 else 配对时遵循“就近原则”。
01.3.2 循环语句
1 while循环
while 语句用来实现“当型”循环结构,其一般形式为“while(表达式)语句;”,当表达式的值非0时,执行 while 语句中的内嵌语句。其特点是:先判断表达式,后执行语句,具体流程如下图所示。当表达式的值非0时,就会执行语句,从而实现语句多次执行的效果。为了避免程序进入死循环(不停地进行循环操作),在语句中需要有让表达式趋近于假的操作来使程序跳出循环。
![](https://i-blog.csdnimg.cn/direct/66161eb502f14efab50090db7afc086f.png)
注意:while后面不能加分号,否则虽然编译可以通过,但是执行程序时会发生死循环。通常我们会将 while语句用花括号括起来,就算 while语句只有一句,也会用花括号括起来,这么做是因为一个程序往往会经过多次修改,使用花括号可以让程序更加清晰,避免向循环内添加语句时出错。
【例】while循环实现计算 1到 100 之间所有整数之和
#include <stdio.h>
//while循环 --计算从1到100的和
int main() {
int i=1,total=0;
while(i<=100) //在这里加分号会造成死循环
{
if(i%2==0)
{
i++;
continue; //continue下面的代码均不会得到执行
}
total=total+i;//把i加到total上
i++;//i++等价于 i+=1; 在循环体内没有让while判断表达式趋近于假的操作,死循环
}
printf("total=%d\n",total);
return 0;
}
运行结果
2 for循环
C语言中的 for 循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替 while 循环语句。其一般形式为
for(表达式 1;表达式 2;表达式 3)语句;
for 循环语句的执行过程如下,具体流程如下图所示。
(1)先求解表达式1;
(2)求解表达式 2,若其值为真(值为非 0),则先执行 for 语句中指定的内嵌语句,后执行第(3)步。若其值为假(值为 0),则结束循环,转到第(5)步;
(3)求解表达式 3;
(4)转回第(2)步继续执行;
(5)循环结束,执行for语句下面的语句。
![](https://i-blog.csdnimg.cn/direct/b5f5bb99ce5c46eeaec22bee918b50ba.png)
for 循环语句中必须且只能有两个分号,用于分割表达式1、表达式 2 和表达式 3。表达式 1、表达式 2、表达式 3 也可省略,省略写法用得较少。如下例所示,“i=1,total=0”是表达式1,即表达式1可以使用逗号初始化多个变量,表达式3的作用是使表达式2趋近于假。
【例】for循环实现计算 1到 100 之间所有整数之和
#include <stdio.h>
//for循环 --从1加到100的和
int main() {
int i,total;
for(i=1,total=0;i<=100;i++) //for小括号后不要加分号
{
total+=i;
}
printf("total=%d\n",total);
return 0;
}
运行结果
01.3.3 continue语句
continue 语句的作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行是否执行下一次循环的判断。其一般形式为
continue;
下面来看一个对1到 100 之间的奇数进行求和的例子,如下例所示。这个例子是对上一节中的 for 循环的改写,执行“continue;”语句后,执行的语句是“i++;”。当continue 用于while和 do while 循环中时,注意不要跳过让循环趋近于假的语句。
【例】对1到100 之间的奇数进行求和
#include <stdio.h>
//for循环 --从1到100之间的奇数进行求和
//使用continue
int main() {
int i,total;
for(i=1,total=0;i<=100;i++) //for小括号后不要加分号
{
if(i%2==0)
{
continue; //continue下面的代码均不会得到执行
}
total+=i;
}
printf("total=%d\n",total);
return 0;
}
运行结果
01.3.4 break语句
break语句的作用是结束整个循环过程,不再判断执行循环的条件是否成立。
下例是关于break语句的例子,从1开始累加,当累加的和大于 2000 时,结束 for 循环,同时打印此时 total 的值和 i 的值。一旦执行break语句,下一句要执行的就是“printf("total=%d,i=%d\n",total,i);”。break 语句也可用在while 循环和 do while 循环中,起结束对应循环的作用。
【例】 break 语句实例
#include <stdio.h>
//for 循环实现从1加到100
int main() {
int i,total;
for(i=1,total=0;i<=100;i++) //for小括号后不要加分号
{
if(total>2000)
{
break; //当和大于2000时,循环结束
}
total+=i;
}
printf("total=%d,i=%d\n",total,i);
return 0;
}
运行结果
练习题
1.while(i<10);这条语句没有问题,程序可以正常运行
A.正确 B.错误
答案:B
解释:当在 while 语句的小括号后面加分号后,会造成死循环。