【C语言3】分支与循环:if-else、关系操作符、条件操作符、逻辑操作符、switch语句、while、for、fo-while循环、break和continue、goto语句
文章目录
前言
持续更新ing,C语言3 来啦 ~
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使用 if
、switch
实现分支结构,使用 for
、while
、do while
实现循环结构。
一、if 语句
- if 语句:表达式为真,则语句执行,表达式为假,则语句不执行。
注:在C语言中,0为假,非0表示真。也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行。
语法形式:
if ( 表达式 )
语句
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
- if-else 同理,语法形式:
if ( 表达式 )
语句1
else
语句2
注意:默认在 if 和 else 语句中默认都只控制一条语句
如果我们要 if 语句同时控制2条及以上语句,那就要使用 {} 将代码括起来,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;
}
-
嵌套 if
在if else
语句中,else
可以与另一个if
语句连用,构成多重判断。 -
悬空 else
如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配,并不是和哪个 if 对齐就和它匹配。
只要带上适当的大括号,代码的逻辑就会更加的清晰,建议大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)//和下一个 else 匹配
printf("hehe\n");
else //悬空else和最近的if匹配
printf("haha\n");
return 0;
}
二、关系操作符
C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个:
• >
大于运算符
• <
小于运算符
• >=
大于等于运算符
• <=
小于等于运算符
• ==
相等运算符
• !=
不相等运算符
关系表达式通常返回 0 或 1 ,表示真假。比如, 20 > 12 返回1 , 12 > 20 返回0 。
关系表达式常用于if 或while 结构。
if (x == 3) {
printf("x is 3.\n");
}
注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写错,它可以运行,但很容易出现意料之外的结果,让你找bug找半天。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。这样的话,如果把 == 误写成 = ,编译器就会报错。
if (3 == x) ...
另一个需要避免的错误是:多个关系运算符不宜连用。
如i < j < k
连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不能保证变量j 的值在i 和k 之间。因为关系运算符是从左到右计算,实际执行的:
(i < j)< k
i < j 返回0 或1 ,所以最终是0 或1 与变量k 进行比较。
正确写法:i < j && j < k
三、条件操作符 ? :
条件操作符也叫三目操作符,需要接受三个操作数,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑:如果exp1为真,计算exp2的值作为结果,否则计算exp3作为结果。
练习1:用条件操作符改造下面代码
#include <stdio.h>
int main()
{
int a = 0,b = 0;
scanf("%d", &a);
/*
if (a > 5)
b = 3;
else
b = -3;
*/ //上面这段可以改造为
b = a>5 ? 3 : -3;
printf("%d\n", b);
return 0;
}
练习2:用条件表达符实现找两个数中较大值
#include <stdio.h>
int main()
{
int a = 0,b = 0;
scanf("%d %d", &a, &b);
int m = a>b ? a : b;
printf("%d\n", m);
return 0;
}
四、逻辑操作符:&&
||
!
4.1. &&
||
!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
• !
:逻辑 取反 运算符(改变单个表达式的真假)。
• &&
:逻辑 与 运算符,并且的意思(两侧的表达式都为真,则为真,否则为假)。
• ||
:逻辑 或 运算符,或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
int main()
{
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
printf("是闰年\n");
return 0;
}
4.2. 短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
比如:
if(month 1 >= 3 && month <= 5)
表达式中 && 的左操作数是month >= 3 ,右操作数是month <= 5 ,当左操作数month >= 3 的
结果是0的时候,就不会再执行有操作数了,因为即使不判断month <= 5 ,整个表达式的结果也是0。
再比如:
if(month == 12 || month==1 || month == 2)
如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
五、switch 语句
5.1. switch语句中的break、default
除了if
语句外,C语言还提供了switch
语句来实现分支结构。
switch
语句是一种特殊形式的 if...else
结构,用于判断条件有多个结果的情况。它把多重
的 else if
改成更易用、可读性更好的形式。
switch (expression) {
case value1: statement
case value2: statement
...
default: statement
}
上面代码中,根据表达式expression 不同的值,执行相应的case 分支。如果找不到对应的值,
就执行 default 分支。
注:
• switch 后的expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
5.2. if语句和switch语句的对比
练习:输⼊任意⼀个整数值,计算除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;
}
上述的代码中,我们要注意的点有:
- case 和后边的数字之间必须有空格
- 每一个case 语句中的代码执行完成后,需要加上break ,才能跳出这个switch语句。
(当然, break 也不是每个case 语句都得有,这就得根据实际情况来看了。)
switch
语句也是分支效果的,只有在switch
语句中使用 break
才能在跳出switch
语
句,如果某一个case
语句的后边没有break
语句,代码会继续往下执行,有可能执行其他case
语句中的代码,直到遇到break
语句或者switch
语句结束。
例如要求:
- 输入1~5,输出的是“工作日”;
- 输入6~7,输出“休息日”
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
在使用 switch 语句的时候,我们经常可能遇到一种情况,比如switch 后的表达式中的值无法匹
配代码中的case 语句的时候,这时候要不就不做处理,要不就得在switch 语句中加入default 子句。
5.2. switch语句中的case和default的顺序问题
在switch
语句中case
子句和default
子句有要求顺序吗? default
只能放在最后吗?
其实,在switch
语句中case
语句和default
语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常是把default
子句放在最后处理的。
六、while 循环
C语言提供了3种循环语句, while
就是其中一种,接下来就介绍一下while
语句。
while
语句的语法结构和if
语句非常相似。
他们的区别在于,while
语句是可以实现循环效果的。
while(表达式)
语句;
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
//代码1
#include <stdio.h>
int main()
{
if(1)
printf("hehe\n"); //if后边条件满足,打印一次hehe
return 0;
}
//代码2
#include <stdio.h>
int main()
{
while(1)
printf("hehe\n"); //while后边的条件满足,死循环的打印hehe
return 0;
}
七、for 循环
for
循环是三种循环中使用最多的, for
循环的语法形式如下:
for(表达式1; 表达式2; 表达式3)
语句;//如果循环体想包含更多的语句,可以加上大括号
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
首先执行 表达式1 初始化循环变量;
再执行 表达式2 的判断部分, 表达式2 == 0,则循环结束,否则继续循环;
循环语句执行完后,再执行表达式3 ,调整循环变量;
然后再去表达式2 的地方执行判断,表达式2 的结果是否为0,决定循环是否继续。
…
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
for 和while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是for 循环的三个部
分非常集中,便于代码的维护,而如果代码较多的时候while 循环的三个部分就比较分散,所以从形式上for 循环要更优一些。
//在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
七、do-while 循环
在循环语句中do while
语句的使用最少,它的语法如下:
do
语句;
while(表达式);
while
和for
这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳
出循环;
而 do while
循环则是先直接进入循环体,执行循环语句,然后再执行 while
后的判断表达式,表
达式为真,就会进行下一次,表达式为假,则不再继续循环。
所以在do while
语句中循环体是至少执行一次的,这是do while
循环比较特殊的地方。
//在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
八、break和continue语句
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了break
和continue
两个关键字,就是应用到循环中的。
• break
的作用是用于永久的终止循环,只要break 被执行,直接就会跳出循环,继续往后执行。
• continue
的作用是跳过本次循环中continue
后边的代码,在for 循环和while 循环中有
所差异的。
-
- while 循环中 break 和 continue
//运行结果:1 2 3 4
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;//当i等于5后,就执行break,循环就终止了
printf("%d ", i);
i = i+1;
}
return 0;
}
//运行结果为:死循环输出 5
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
//当i等于5后,就执行continue,直接跳过continue的代码,去循环的判断的地方
//因为这里跳过了i = i+1,所以i一直为5,程序陷入和死循环
printf("%d ", i);
i = i+1;
}
return 0;
}
上面这段代码这里我们就能分析出来,continue
可以帮助我们跳过某一次循环continue
后边的代码,直接到循环的判断部分,进行下一次循环的判断,如果循环的调整是在continue
后边的话,可能会造成死循环。
- for 循环中 break 和 continue
//运行结果为:1 2 3 4
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
return 0;
}
//运行结果为:1 2 3 4 6 7 8 9 10
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这里continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
- do while 循环中的 break 和 continue
do.while 语句中的break 和continue 的作用和while 循环中几乎一模一样,大家下来可以自行测试并体会。
前面学习了三种循环while , do while , for ,这三种循环是可以嵌套在一起的,有时可以更好的解决问题,就是我们所说的:循环嵌套。
九、goto语句
C语言提供了一种非常特别的语法,就是goto
语句和跳转标号, goto
语句可以实现在同一个函数内跳转到设置好的标号处。
例如:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以建议是能不用尽量不去使用;但是goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳
出,使用 goto 就非常的方便了。
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
本来for 循环想提前退出得使用 break ,一个break 只能跳出一层for 循环,如果3层循环嵌套就得使用3个break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。
总结
这一节我们学习了 if-else语句、关系操作符、条件操作符、逻辑操作符、switch语句、三大循环、break和continue语句以及goto语句,收获多多呀!接下来我们将学习两个趣味小游戏。
请跳转:
- 猜数字的趣味小游戏——rand函数、srand函数、time函数的使用
https://blog.csdn.net/Uu_05kkq/article/details/144197436?spm=1001.2014.3001.5501 - 电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用
https://blog.csdn.net/Uu_05kkq/article/details/144193659?spm=1001.2014.3001.5501
原文地址:https://blog.csdn.net/Uu_05kkq/article/details/144972441
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!