C语言学习系列-->第四弹【分支和循环】

文章目录

  • 前言
  • 一、if 语句
    • 1.1 基本 if 语句
    • 1.2 else 语句
    • 1.3 else if 语句
    • 1.4 嵌套 if 语句
    • 1.5 else 悬空问题
  • 二、关系操作符
  • 三、逻辑操作符
    • 逻辑取反运算符
  • 四、switch 语句
    • 4.1 作用
    • 4.2 语法
    • 4.3 switch语句中的case和default的顺序问题
  • 五、while 循环
    • 5.1 作用
    • 5.2 语法
  • 六、for 循环
    • 6.1 作用
    • 6.2 语法
  • 七、do-while
    • 7.1 作用
    • 7.2 语法
  • 八、 break和continue语句
    • 8.1 while循环中的break和continue
      • 8.1.1 break举例
      • 8.1.2 continue举例
    • 8.2 for循环中的break和continue
      • 8.2.1 break举例
      • 8.2.2 continue举例
  • 九、嵌套循环
  • 十、go to 语句
  • 总结

前言

从本节开始,将进入C语言循环分支结构,在学习过程中,需要多敲代码,多刷题。

下面是来自牛客竞赛的小白题,学习完本节,可以进行相应的练习:
选择结构程序设计
循环结构程序设计

一、if 语句

1.1 基本 if 语句

if(条件表达式){
    //语句
}

条件表达式为真,就执行语句;条件表达式为假,就不执行语句。通俗易懂!

在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果是不是0,则语句执⾏。

#include  
 
int main(){
 
    int a;  //定义一个int型变量a
 
    scanf("%d", &a);  //读入a的值
 
    if(a != 0){  //如果a的值不为0
        printf("%d\n", a);  //输出a的值并输出一个回车
    }
 
    //若a的值为0,则不会执行任何内容,程序正常退出
 
    return 0;
}

1.2 else 语句

if ( 表达式 )
    语句1
else
	语句2

举个例子:

#include  
 
int main(){
 
    int a;  //定义一个int型变量a
 
    scanf("%d", &a);  //读入a的值
 
    if(a != 0){  //如果a的值不为0
        printf("%d\n", a);  //输出a的值并输出一个回车
    }
    else{
        printf("a的值为0!\n");  //若a的值为0,输出"a的值为0!"并输出一个回车
    }
 
    return 0;
}

1.3 else if 语句

if(条件表达式1){
        //语句1
    }
    else if(条件表达式2){
        //语句2
    }
    else{
        //语句3
    }

举个例子:

#include  
 
int main(){
 
    int a;  //定义一个int型变量a
 
    scanf("%d", &a);  //读入a的值
 
    if(a > 100){  //如果a的值大于100
        printf("%d\n", a - 100);  //输出a - 100的值并输出一个回车
    }
    else if(a > 0 && a <= 100){  //如果a的值大于0且a的值小于等于100
        printf("%d\n", a + 100);  //输出a + 100的值并输出一个回车
    }
    else if(a == 0){  //若a的值为0
        printf("a的值为0!\n");  //输出"a的值为0!"并输出一个回车
    }
    else{
        printf("a的值为小于0!\n");  //若a的值不满足以上所有条件,输出"a的值小于0!"并输出一个回车
    }
 
    return 0;
}

1.4 嵌套 if 语句

在 if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。

#include  
 
int main(){
 
    int a;  //定义一个int型变量a
 
    scanf("%d", &a);  //读入a的值
 
    if(a > 0){
        if(a > 100){  //如果a的值大于100
            printf("%d\n", a - 100);  //输出a - 100的值并输出一个回车
        }
        else{
            printf("%d\n", a + 100);  //输出a + 100的值并输出一个回车
        }
    }
    else if(a == 0){  //若a的值为0
        printf("a的值为0!\n");  //输出"a的值为0!"并输出一个回车
    }
    else{
        printf("a的值为小于0!\n");  //若a的值不满足以上所有条件,输出"a的值小于0!"并输出一个回车
    }
 
    return 0;
}

以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。

1.5 else 悬空问题

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

#include 
int main()
{
 	int a = 0;
	int b = 2;
 	if(a == 1)
 		if(b == 2)
			 printf("hehe\n");
	else
	printf("haha\n");
 	return 0;
}

上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if进⾏匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。

如果我们希望else确实和第⼀个if匹配,可以这样修改代码:

#include 
int main()
{
 	int a = 0;
 	int b = 2;
 	if(a == 1)
 	{
 		if(b == 2)
 			printf("hehe\n");
 	}
 	else
 	{
 		printf("haha\n");
 	}
 	return 0;
}

只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。

二、关系操作符

• > ⼤于运算符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符

关系表达式常⽤于 if 或 while 结构。

注意,相等运算符与赋值运算符 = 是两个不⼀样的运算符,不要混淆。

另⼀个需要避免的错误是:多个关系运算符不宜连⽤

三、逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

注:C语⾔中,⾮0表⽰真,0表⽰假

逻辑取反运算符

⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:

if(!flag)
{
 printf("do something\n");
}

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。

四、switch 语句

4.1 作用

执行多条件分支语句。

4.2 语法

switch(expression){
 
    case value1:执行语句1; break;
 
    case value2:执行语句2; break;
 
    ...
 
    default: 执行语句n; break;
 
}

注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式

•case 和后边的数字之间必须有空格
•每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。

4.3 switch语句中的case和default的顺序问题

在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。

五、while 循环

5.1 作用

满足循环条件,执行循环语句。

5.2 语法

 while(条件表达式){
    //语句 
 }

C语言学习系列-->第四弹【分支和循环】_第1张图片

在执行循环语句时候,程序必须提供跳出循环的出口,否则出现死循环。

代码示例:

#include 
int main()
{
 	int i = 1;
 	while(i<=10)
 	{
 		printf("%d ", i);
 		i = i+1;
 	}
 	return 0;
}

六、for 循环

6.1 作用

先判断条件表达式,满足循环条件,执行循环语句。

6.2 语法

for(初始化条件; 判断条件; 更新){
    //语句
}

for 循环中的表达式,要用分号进行分隔。
for 语句的三个部分中,任何一个部分都可以省略。
其中,若省略了判断条件,相当于判断条件永远为真。

代码示例:

#include 
int main()
{
 	int i = 0;
 	for(i=1; i<=10; i++)
 	{
 	printf("%d ", i);      //1 2 3 4 5 6 7 8 9 10
 	}
 
 	return 0;
}

for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些。

七、do-while

7.1 作用

满足循环条件,执行循环语句。

7.2 语法

do{
    //语句
}while(条件表达式);

while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。

代码示例:

#include  
 
int main() {
 
    int n;
 
    scanf("%d", &n);
 
    int sum = 10;
 
    do{  
        printf("%d\n", sum);  //输出sum的值和回车
        sum --;  //执行完一次循环,sum的值减1
    }while(sum >= n);  //当sum大于等于n时执行
 
    //若输入的n值大于10,则仍会先执行一次语句,再判断循环条件
 
    return 0;
 
}

八、 break和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中
提供了 break 和 continue 两个关键字,就是应该到循环中的。
• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
• continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所
差异的。

8.1 while循环中的break和continue

8.1.1 break举例

#include 
int main()
{
 	int i = 1;
 	while(i<=10)
 	{
 		if(i == 5)
 			break;//当i等于5后,就执⾏break,循环就终⽌了
 		printf("%d ", i);        //1 2 3 4
 		i = i+1;
 	}
 	return 0;
}

打印了1,2,3,4后,当i等于5的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。
所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。
那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。

8.1.2 continue举例

#include 
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;
}

8.2 for循环中的break和continue

8.2.1 break举例

#include 
int main()
{
 	int i = 1;
 	for(i=1; i<=10; i++)
 	{
 		if(i == 5)
 			break;
 		printf("%d ", i);        //1 2 3 4
 	}
 	return 0;
}

break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以使⽤ break 来完成。

8.2.2 continue举例

#include 
int main()
{
 	int i = 1;
 	for(i=1; i<=10; i++)
 	{
 		if(i == 5)
 			continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
 		printf("%d ", i);    //1 2 3 4 6 7 8 9 10
 	}
 	return 0;
}

所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调
整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤
continue 来实现。

九、嵌套循环

嵌套循环就是将上述语句混合在一起使用

代码示例

#include  
 
int main() {
 
    int n;
 
    scanf("%d", &n);
 
    for(int i = 1; i <= n; i ++){  //当i小于等于n时,执行循环体内的语句,执行之后,i的值加1
        for(int j = 1; j <= i; j ++){//当j小于等于i时,执行循环体内的语句,执行之后,j的值加1
            printf("%d ", j);  //输出j的值
        }
        printf("\n");  //执行完内层的循环之后,输出一次回车
    }
 
    return 0;
 
}

这里,具体需要大家在习题中感受领悟。

十、go to 语句

C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。

#include 
int main()
{
 	printf("hehe\n");
 goto next:
 	printf("haha\n");
 
next:
 	printf("跳过了haha的打印\n"); 
 	return 0;
}

go to 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以小编的建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。

总结

从本节开始,知识难度增加啦。开始更加考验大家逻辑思维能力了,想要提高思维,就需要多刷题,想要熟练掌握语法,依然需要多刷题。
选择结构程序设计
循环结构程序设计

你可能感兴趣的:(C语言学习系列,c语言,学习,算法)