C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。也就是说在C语言所有的代码都是这三种结构。
本篇文章将会着重讲解转向语句break、continue和goto语句的使用
关于C语言三种结构的详细讲解请阅读前两篇文章
【C语言基础篇】结构控制(上)顺序结构和选择结构-CSDN博客
转向语句用来直接控制程序的执行流程,从而改变循环结构、选择结构以及函数的正常执行流程。 这些语句在编写程序时常被用到,特别是当循环体内部分支比较复杂时,可用于简化分支语句的条件,减少条件分支语句if的嵌套深度及分支数,使程序更易阅读和理解。 在编写代码时,应根据实际需求选择合适的转向语句,并确保代码的可读性和可维护性。 (但goto语句尽量少用,因为这不利于结构化程序设计,滥用它会使程序流程无规律、可读性差,稍后会在文章中介绍)
break 的作用是用于跳出switch结构或循环结构,只要 break 被执行,直接就会跳出循环或switch代码块,继续往后执执行。 当有break语句位于多重循环的内循环中,它只能跳出内循环,即只能跳出一层循环。
下面以打印1-10的数字为例,分别展示break在三种循环中的使用和效果
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break; //当i=5时,break跳出循环,结束打印
printf("%d ", i); //打印结果为1 2 3 4
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
break; //当i=5时,break跳出循环,结束打印
printf("%d ", i);//打印结果为1 2 3 4
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;//当i=5时,break跳出循环,结束打印
printf("%d ", i);//打印结果为1 2 3 4
i++;
} while (i <= 10);
return 0;
}
break对于switch语句的作用不同于三种循环—— break在switch中属于是必不可少的选项。在switch中,case相当于switch的入口,break相当于switch的出口。如果没有在某个case后面没有break语句,代码会继续往下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束
比如下面这个例子,输入一个数字打印周几,正常情况下应该是每个case跟一句break,这样能做到“一进一出”
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("周一\n");
break;
case 2:
printf("周二\n");
break;
case 3:
printf("周三\n");
break;
case 4:
printf("周四\n");
break;
case 5:
printf("周五\n");
break;
case 6:
printf("周六\n");
break;
case 7:
printf("周日\n");
break;
}
return 0;
}
比如输入一个数字2,就会输出周二
如果去掉break语句,再输入一个数字2。就会看到程序从case 2进入之后,直到整个switch语句执行完才结束
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("周一\n");
case 2:
printf("周二\n");
case 3:
printf("周三\n");
case 4:
printf("周四\n");
case 5:
printf("周五\n");
case 6:
printf("周六\n");
case 7:
printf("周日\n");
}
return 0;
}
当然,break在switch语句中不一定要在每一条case语句后面出现
当需要多个case入口共用一段代码和出口,就可以省略break。
比如下面这种情况
#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;
}
break用于循环结构中时,在while循环、for循环和do...while循环中的使用方法和效果相同。 都是在满足某个条件时,使用break跳出循环,不再执行未完成的循环语句。不过要注意,break只能跳出一层循环,如果要跳出多层循环,需要在对应的每层循环中使用break语句。 break用于switch结构时,一般情况下,每条case语句和default语句都需要有对应的break语句。但需要多个case语句共用一个“出口”时,只在最后一个入口的后面跟随break语句
continue的作用时在循环结构中,根据某个判断条件结束本次循环,即循环体中continue语句后边的部分不再执行,直接进入下一次循
下面依然以打印1-10的数字为例,分别展示continue在三种循环中的使用和效果
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
当i=5时,continue跳出本次循环,但由于跳过了循环变量调整部分,导致了死循环
打印结果为1 2 3 4...死循环(可以看到控制台的光标一直在闪烁)
#include<stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
当i=5时,continue跳出本次循环,进入到循环变量调整和循环条件判断部分(因为for循环的循环变量调整部分是单独拿出来的,所以没有像while循环中使用continue一样进入死循环)
打印结果为1 2 3 4 6 7 8 9 10
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
当i=5时,continue跳出本次循环,但由于跳过了循环变量调整部分,所以和上面的while循环一样,导致了死循环
打印结果为1 2 3 4...死循环
continue在三种循环中的使用方法都是相同的——在满足某种条件时,使用continue跳过每次循环后面的代码,直接进入下一次循环 但continue在三种循环中的使用效果有所不同:
goto语句也称为无条件转移语句,在C语言是⼀种非常特别的语法,goto 语句和语句标号配合使用, 可以实现在同⼀个函数内跳转到设置好的标号处。 C语言不限制程序中使用标号的次数,但各标号不得重名。goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句。 goto 语句通常与选择语句配合使用,比如 if 语句。可用来实现条件转移, 构成循环,跳出循环体等功能。但是要注意,goto语句与 if 语句构成的循环,是无法用break打破的 所以在结构化程序设计中一般不主张使用 goto 语句来强制改变程序的走向, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
goto语句的使用格式如下
goto 语句标号; ......... 语句标号: ........
goto语句使用示例
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
goto exit;
printf("%d ", i);
i++;
}
exit:
printf("\n");
return 0;
}
程序执行结果如下
goto 语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用; 但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用 goto 就非常的⽅便了
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
在C语言中,return语句用于从函数中返回。 当程序执行到函数中的return语句时,函数的执行会立即结束,返回到调用该函数的地方。return语句可以带有一个表达式,该表达式的值将作为函数的返回值。 如果return语句没有表达式,那么函数返回的值是未定义的。
1. void类型函数 无需返回值和return语句
void print(int num)
{
for (int i = 0; i <= i; i++)
{
printf("%d ", i);
}
}
2.多个return语句作为不同情况下的返回值
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
3.应返回值的函数没有return语句
#include<stdio.h>
int max(int a,int b)
{
}
int main()
{
int m = 1, n = 2;
printf("%d", max(m, n));
}
main函数的返回值默认为0
其他函数的返回值时一个随机值
4.函数的返回值是指针类型
int* add(int m, int n)
{
int *result= (int*)malloc(sizeof(int) * 2);
result[0] = m;
result[1] = n;
return result;
}
C语言中,转向语句有break、continue、goto、return四种,分别有着不同的使用方法和效果
如若您发现文章存在错误,还望多多指正