文章目录
- 前言
- 1. 条件判断语句(分支语句)
- 1.if语句
- if …else…
- else if
- if语句的嵌套
- if语句中的悬空问题
- 2.switch语句
- .与转向语句(break)的运用
- 2.循环执行语句
- 1.while语句
- while语句中的break和continue
- 2.do while语句
- 3.for语句
- for语句的嵌套
- for语句中的break和continue;
前言
本文章讲解控制语句当中的分支语句和循环执行语句,控制语句在C语言中是用于控制程序的执行流程,以实现对程序流程的选择、循环、转向和返回等进行控制。
C语言中共有9种控制语句,它们由特定的语句定义符组成,可以分为以下三类:
(1)条件控制语句(也叫分支语句):
if语句,switch语句;
(2)循环执行语句:
do while语句、while语句、for语句;
(3)转向语句:
break语句、go to语句(此语句尽量少用,因为这不利于结构化程序设计,滥用会导致程序流程无规律,可读性差)、continue语句、return语句;
“表达式”可以为算数、关系、逻辑、赋值等
“语句”可以是赋值语句、函数调用语句、控制语句、复合语句、空语句。
1. 条件判断语句(分支语句)
条件判断语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。(在C语言中我们用“0”来表示假,非“0”表示真)
因此,在编写选择语句之前要先明确判断条件并且知道对此语句所给定的判断条件到底什么时候是真,什么时候是假,然后再确定当判断结果为“真”或“假”时应分别执行什么样的操作(算法);
1.if语句
if后面的括号()中如果为逻辑真,则进入if语句中,否则不进入该语句;且当if语句中所写的代码块中超过一句时,需要用{}花括号括起来,因为它只能控制第一句,无法控制后面的代码;
if …else…
if(表达式)
语句;
else
语句;
else后面不用跟表达式,因为如果不符合上面任何一种情况,就一定是else中判断条件,如果写上会报错
int main(){int input = 0; printf("加入比特\n");printf("要好好学习吗(1/0)?");scanf("%d\n", &input);//if (input == 1){printf("好offer\n");}else{printf("卖红薯");};return 0;};
这里的else后就没有跟表达式,在if后面的表达式里input==1,由于非零表示逻辑真,所以这里用了1来表示逻辑真,我们也可以将上面printf函数中的(1/0)改为任意(非零数/0)下面的表达式也就能该为任意非零数;
else if
当有大于两个分支的情况下,我们用if语句表达时要用到else if 来表示第三种情况,这时候表现为:
//if(表达式1)//语句;//else if(表达式2)//语句;//else//语句;
这里我们举个例子
int main(){int x = 0;int y = 0;scanf_s("%d", &x);if (x < 0)return y = 1;else if (x == 0)return y = 0;elsereturn y = -1;return 0;}
这里面就出现了三个条件判断,于是我们用到了else if来表示第三种;
if语句的嵌套
if语句和if语句之间可以进行嵌套;表示为
#include int main ( ){double fuel_reading;printf("输入油量表读数(0-1): ");scanf("%lf", &fuel_reading);//下面加上花括号使if-else能够正确匹配if (fuel_reading < 0.75){if (fuel_reading < 0.25)printf("油量低,注意!\n");}else{printf("高油量,不必停!\n");}return 0;}————————————————版权声明:本代码为CSDN博主「Geek宝宝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/Zzwtyds/article/details/74128209
if语句中的悬空问题
悬空else是一个非常容易别误导的一个问题,看下面一串代码;
#includeint main(){int a = 0;int b = 2;if (a == 1) if (b == 2)printf("hehe\n");elseprintf("haha\n"); return 0;}
在这串代码中如果你的答案是haha,那你就答错了,首先 if表达式后只能跟一条子句,若该子句中含有多条语句,则必须用大括号括起来变成一个语句块(因为语句块可以被当成一条语句)。在这串代码中其实else是跟下面的if表达式对应的,那么这个代码最后运行出来的结果其实是什么都没有;
这个问题的缘由其实是不规范的代码风格导致的;在悬空else问题上,else会跟最近的if来对应
正确的应该是:
#includeint main(){int a = 0;int b = 2;if (a == 1){if (b == 2){printf("hehe\n");}else{printf("haha\n");}}return 0;————————————————版权声明:本文为CSDN博主「圣喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_66769266/article/details/124145982
2.switch语句
它的结构形式表现为
switch(整型表达式)
{
case 常量1: 语句1
case 常量2: 语句2
case 常量3: 语句3
···
case 常量n: 语句n
deafult:语句n+1
}
在switch语句中,相比于使用多个if…else…语句使用switch语句可以提高代码的可读性和可维护性。它的基本结构为将变量或表达式与多个可能的值进行比较,当表达式的值与某个case语句的值相匹配时,就会执行该case下的代码块,直到遇到break语句为止。
switch后所跟表达式必须是整型表达式
在语句中case后所跟的常量,必须是整型常量表达式,且必须保证每个case常量都不相同
每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置
.与转向语句(break)的运用
到这里就出现一个问题,当我们使用switch语句写出一串代码时
#includeint main(){int b;int a = 1;switch (a){case 1: b = 30;case 2: b = 20;case 3: b = 16;default: b = 0;}printf("%d\n", b);return b;}
当我们写这样一个代码时,可能觉得运行结果是30,那就错了,它的结果是“0”,为什么呢?
因为在第一个case结束后,由于没有用break来跳出该分支语句,所以它会继续向下进行,直到运行到default,那么我们就需要加上break来跳出循环。
int main(){int b;int a = 1;switch (a){case 1: b = 30; break;case 2: b = 20; break;case 3: b = 16; break;default: b = 0;}printf("%d\n", b);return b;}
在switch语句中它会一直执行下去知道遇见break或是default,多个case可以执行同一语句,根据这一原则我们还可以换种方式去写
#define _CRT_SECURE_NO_WARNINGS#include int main(){int a = 0;scanf("%d", &a);switch (a){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("节假日\n");}return 0;}
continue关键字是用来终止当前迭代,并进入到下一次迭代
在switch语句与continue的运用中,continue会使得当前case被退出,并执行下一个case,而不是执行当前case中的后续代码,在这其中continue只能作用于循环体当中,不能直接放在switch语句中,除非它原本就是for或其他循环的一种;
2.循环执行语句
C语言提供的三种循环语句都是有相似的三部分组成:进入循环的条件,循环体,退出循环的条件;完成的功能也类似。只不过是三者进入与退出循环的方式不同;
1.while语句
while(表达式)
当条件满足表达式时,程序进入循环当中,在执行一次循环之后,再次对执行过循环的数据代入到表达式中进行判断,若依旧满足则继续执行,直到条件不满足时退出循环,否则重复执行循环体
while语句中的break和continue
在while循环中,break的作用是永久终止循环
int main(){int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int mid = 0;int k = 7;int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;int right = sz-1;while (left <= right){mid = (right + left) / 2;if (arr[mid] < k){left = mid + 1;}else if (arr[mid] > k){right = mid - 1;}else{printf("找到了,下标是:%d\n",mid);break;}}if (left > right)printf("找不到\n");return 0;}
这里面当我们在找到了之后,遇到了break,于是跳出了循环;
continue
continue在while循环中的作用是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接 跳转到while语句的判断部分。进行下一次循环的入口判断。
continue语句和break语句的区别是:
continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
2.do while语句
do
表达式1(代码块);
while(表达式2)
在该语句中,不论一开始是否满足表达式2,无条件进入循环执行一次,执行一次循环体后判断是否满足条件,当条件满足时重复执行循环体,直到条件不满足时退出。
3.for语句
for循环,for(表达式1;表达式2;表达式3)
在for循环中,表达式1表示为初始化
表达式2为条件判断部分,用于判断循环是否终止
表达式3为调整部分,用于循环条件的调整
举个例子
#include int main(){ int i = 0; //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/) for(i=1; i<=10; i++) { printf("%d ", i); } return 0;}
这里使用循环打印1到10的数字,初始化语句只在循环开始前执行一次,每次执行循环体时要先判断是否符合条件,如果循环条件判断为真,则执行循环体,再执行迭代语句。所以对于for循环,循环条件总比循环体多执行一次。
for语句的嵌套
for语句也可以进行嵌套,它不仅可以和for语句相互嵌套,还可以和if语句,switch语句,while语句等进行嵌套
int main(){int arr[] = { 1,2,3,4,5,6,7,8,9 };int k = 0;int i = 0;scanf("%d", &k);int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){if (arr[i] == k){printf("\n找到了,下标是:%d\n", i);break;}else{printf("\n找不到,不在此数组中");}}return 0;}
for语句中的break和continue;
在for循环中,break的作用是跳出循环不在执行
而continue是跳过当前循环中剩下的语句,执行下一次循环;
#include //代码1:for中的break//输出结果为1 2 3 4int main(){int i = 0;for (i = 1; i <= 10; i++){if (i == 5)break; printf("%d ", i);}return 0;}//代码2:for中的continue//输出结果为1 2 3 4 6 7 8 9 10#include int main(){int i = 0;for (i = 1; i <= 10; i++){if (i == 5)continue;printf("%d ", i);}return 0;}