C语言的分支语句和循环语句是我们在学习编程语言时的必经之路
一、了解所有的操作符
1.关系操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator),主要有下⾯6个:
(1) > 大于
运算符
(2) <
小于运算符
(3) >= 大于等于运算符
(4) <= 小于等于运算符
(5) == 相等运算符
(6) != 不相等运算符
关系表达式通常返回0(假)或1(真)
注意:在C语言中非0的所有数都可以表示真。
在写关系操作语句时可能会遇到以下问题:
(1)
相等运算符 ==
与赋值运算符
=
是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写
出下⾯的代码,它可以运行,但很容易出现意料之外的结果。
1 if (x = 3) ...
上面实例中,原意是
x == 3
,但是不小心写成
x = 3
。这个式⼦表⽰对变量
x
赋值
3
,它的返
回值为
3
,所以
if
判断总是为真。 为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。
1 if (3 == x) ...
这样的话,如果把 == 误写成 = ,编译器就会报错。
(2)很多新手程序员在写程序时会想当然地将多个关系运算符连用,这是大忌。
1 i < j < k
上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
1 (i < j) < k
上⾯式⼦中,
i < j
返回
0
或
1
,所以最终是
0
或
1
与变量
k
进⾏⽐较。如果想要判断变量
j 的值是否在 i
和
k
之间,应该使⽤下⾯的写法。
1 i < j && j < k
这里的&&,就是我们马上要讲到的逻辑操作符。
2.逻辑操作符
(1) !
:逻辑取反运算符(改变单个表达式的真假)
(2)
&&
:与运算符,就是并且的
意思(两侧的表达式都为真,则为真,否则为假)
(3) ||
:或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)
这里的与或运算大家可以跟数学当中的交并运算联系起来理解,其实还是很容易接受的,下面着重介绍一下逻辑取反运算。
这张图就可以很清晰地介绍逻辑取反是怎样一回事了,在后面的分支语句中咱们再结合到一起进行理解。
上面两张图是对与或运算的补充。
3.条件运算符
条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
1 exp1 ? exp2 : exp3
这里的? 就是我们要介绍的条件运算符,也是C语言中唯一一个三目运算符。条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
比如:我们想要找两个数的较大的一个,我们可以这样写:
#include <stdio.h>
int main()
{
int a = 0;
int b =0;
scanf(("%d %d", &a, &b);
int m = a>b ? a : b;
printf("%d\n", m);
return 0;
}
我们从键盘上读入两个数a,b之后,重新定义一个m,来接一下a>b的返回值,如果a>b是真的即返回值为1,那么就把a的值赋给m,如果a>b是假的即返回值为0,那么就把b的值赋给m,最后输出m的值即为两个数中较大的那个了。
二、分支语句
1.if语句
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
if后面跟的表达式,也就是这里的(num % 2 == 1),如果它的值为真,那么就执行后面的语句,也就是我们的printf,如果为假,则结束。
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表 ⽰呢?
这⾥就需要
if...else...
语句了:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
2.switch语句
除了
if
语句外,C语⾔还提供了
switch
语句来实现分⽀结构。 switch 语句是⼀种特殊形式的
if...else
结构,⽤于判断条件有多个结果的情况。它把多重的 else if
改成更易⽤、可读性更好的形式。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
上⾯代码中,根据表达式
expression
不同的值,执⾏相应的
case
分⽀。如果找不到对应的值, 就执⾏ default
分⽀。
注:
(1) switch 后的 expression 必须是整型表达式
(2) case 后的值,必须是整形常量表达式
我们将if语句和switch对比一下,大家就更容易理解了:
用C语言完成:输⼊任意⼀个整数值,计算除3之后的余数
如果使⽤if语句完成,如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
如果使⽤switch语句改写,就可以是这样的:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上述的代码中,我们要注意的点有:
1. case 和后边的数字之间必须有空格
2. 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
如果去掉break会怎样呢?
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
我们运行代码,输入7
原因是
switch
语句也是分⽀效果的,只有在
switch
语句中使⽤
break
才能在跳出
switch
语句,如果某⼀个 case
语句的后边没有
break
语句,代码会继续玩下执⾏,有可能执⾏其他
case语句中的代码,直到遇到 break
语句或者
switch
语句结束。就⽐如上⾯的代码就执⾏了
case 2 中的语句。所以在 switch
语句中
break
语句是⾮常重要的,能实现真正的分⽀效果。
当然,
break
也不是每个
case
语句都得有,这就得根据实际情况来看了。
另外,
在使⽤
switch
语句的时候,我们经常可能遇到⼀种情况,⽐如
switch
后的表达式中的值⽆法匹
配代码中的
case
语句的时候,这时候要不就不做处理,要不就得在
switch
语句中加⼊
default ⼦句。
switch
后边的
expression
的结果不是
value1
,也不是
value2
的时候,就会执⾏
default
⼦句。
注意:
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。
今天的分支循环内容就到这里,希望对你有帮助。