前言
为何要有分支与循环?分支与循环是编程语言中非常重要的概念,它们可以使程序员更好的控制程序的逻辑,也使得程序更好的贴合现实生活,更好的服务生活。
分支结构
1.1 if语句
if语句形式如下:
if(表达式)
{
语句
}
若表达式为真,则语句执行,若表达式为假,则不执行。
注意:在c语言中,0为假,非0为真,即if括号中的表达式可单纯为数字。
例子:
#include <stdio.h>
int main()
{
int a = 0;
if(a == 0)
{
printf("%d\n",a);
}
return 0;
}
运行结构如下:
1.2 if-else语句
光有if语句还不够,在遇到分叉路口的时候,else语句可以使我们更加简洁的进行逻辑处理。
同时,else和if要搭配使用。
if-else语句形式如下1:
if( 表达式 )
语句1
else
语句2
例子:判断一个整数是奇数还是偶数。
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a % 2 == 0)
{
printf("a为偶数\n");
}
else
{
printf("a为奇数\n");
}
return 0;
}
运行结果:
注意:可以看到,上面的程序中只写了判断偶数的表达式,但是依然可以正确判断数字的奇偶性,
这是因为if-else语句的运行逻辑是这样的:
1.3 if-else嵌套
if-else语句还可以相互嵌套,例如:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输⼊的数字是0\n");
else if (num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
注意:else只和向前最近的if“组队”。
1.4 switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。 switch 语句是⼀种特殊形式的 if-else 结构,用于判断条件有多个结果的情况。它把多重的if-else改成更易用、可读性更好的形式。
其句式表达如下
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
其运行逻辑为根据expression的值,执行相应的case分支,若找不到,就执行default分支(default并非一定要写在末尾)。
注:switch后的expression必须是整型表达式
case后的值,必须是整形常量表达式
例子:
#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;
}
其中的break用于跳出switch语句,case只是switch语句执行的入口,举例来说,若无break,从case1开始执行,打印“余数是1”后也会打印“余数是2”。
循环结构
c语言提供了3种循环语句,分别为while,do-while和for语句。
1.1 while语句
其语法结构为:
while(表达式)
{
语句
}
若表达式为真,则运行语句,否则结束,其逻辑为:
1.2 do-while语句
其句式表达为:
do
{
语句
}
while(表达式)
其执行逻辑和while的区别在于,do-while中的语句至少会被执行一次,之后才会对表达式进行判断,之后就和while的运行逻辑一样了。
1.3 for语句
for循环是三种循环中使用最多的
其句式表达如下
for(表达式1;表达式2;表达式3)
{
语句
}
表达式1用于循环变量的初始化
表达式2用于循环条件的判断
表达式3用于循环变量的调整
其执行逻辑以实际为例:
#include <stdio.h>
int main()
{
for (int a = 0; a <= 10; a++)
{
printf("%d\n", a);
}
return 0;
}
其运行逻辑为先执行int a = 0(表达式1),接着判断a <=10(表达式2),执行printf()(语句),
接着执行a++(表达式3),再执行a <=10(表达式2),再执行printf()(语句),循环往复,直到a<=10为假,不执行语句,循环结束。
注意:顺序为 表达式1->表达式2->语句->表达式3->表达式2->语句->表达式3->表达式2->....(当表达式2为假时结束并且不执行语句)
1.4 break和continue
break和continue可以用来跳出循环和继续循环
举例说明:
int main()
{
for (int a = 0; a <= 10; a++)
{
if (a == 3)
{
break;
}
printf("%d\n", a);
}
return 0;
}
可以看到,该循环并没有将1-10全部打印,而是在a==3为真时执行了break语句使得程序跳出了break循环。
注意:在多层嵌套for循环语句中,break一次只能跳出最里面的循环。
把break替换成continue
#include <stdio.h>
int main()
{
for (int a = 0; a <= 10; a++)
{
if (a == 3)
{
continue;
}
printf("%d\n", a);
}
return 0;
}
可以看到,这次并没有打印3,这是因为,continue的作用是回到循环的开始位置,对于for循环,continue会回到for循环的表达式3,然后继续for循环。
1.5 go to语句
在多重嵌套的循环结构中,使用break语句跳出循环需要一层一层跳出,但是goto循环可以一次跳出多个循环。
举例:
#include <stdio.h>
int main()
{
printf("1\n");
goto next;
printf("2\n");
next:
printf("3\n");
return 0;
}
可以看到2被跳过而没有打印,其实是goto语句是得程序执行到goto next;时直接跳到next:后的程序内容去了。