在c编程中,有时我们需要先对语句作出判断然后选择相应的语句执行,这样就会使用到我们的分支语句。分支语句是根据编程着输入的指令有条件的选择执行路径,而不是只按照语句的顺序依次执行。分支结构的设计关键在于分支条件的构建,适合于带有逻辑或比较关系等的判断。
1.分支语句
1.1if else
1.11单分支
此语句if首先判断条件的真假,若条件为真则执行属于if语句作用域下的语句或语句块,否则执行else语句作用域下的语句或语句块。
#include<stdio.h>
int main()
{
if()
语句1;
else
语句2; //分号作为语句的结束
语句3; //此语句不属于if else 控制之内
if()
{
语句4;
}
else
{
语句5;
语句6; //语句5.6都数于if else控制之内,一对花括号就是一个代码块,同属于一个作用域
}
}
示例:
#include<stdio.h>
int main()
{
int a=30,b=20;
int max=0;
if(a>b)
{
max=a;
}
else
{
max=b;
a++;
}
return 0;
}
#include<stdio.h>
int main()
{
int a=30,b=20;
int max=0;
if(a>b)
max=a;
else
max=b;
a++;
return 0;
}
你知道这两个程序中最终a的值各是多少吗?可能有人认为二者输出的值一样,但事实却不是这个样子的,由于第二个程序未加花括号,else后面只执行max=b语句,无论a、b谁的值大最终都会执行a++,所以第一个输出a=30,第二个输出a=31.
小提示:不管if else后有几条语句都应用{}括起来,这样的代码风格良好,简单易懂。
1.12多分支、嵌套
不管是多分支还是单分支,if else的使用规则是不变的,使用分支嵌套时需要注意if 和 else的配对问题,他们一般情况对称配对,else与和它最近的if配对。
示例:
1.嵌套
#include<stdio.h>
int main()
{
int a=10,b=20;
if(a!=b)
{
if(a>b)
{
printf("a>b\n");
}
else
{
printf("a<b\n");
}
}
else
{
printf("a=b\n");
}
return 0;
}
2.多分支
#include<stdio.h>
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
if(a>b)
{
printf("a>b");
}
else if(a<b)
{
printf("a<b");
}
else
{
printf("a==b");
}
return 0;
}
1.2switch
switch用来代替简单的、有多个分支的if else语句。
#include<stdio.h>
int main()
{
switch(整型变量表达式)
{
case 常量1:语句1;break; //break用于跳出switch语句;
case 常量2:语句2;break;
case 常量3:语句3;break;
dafault:语句;break;
}
}
当变量表达式中的值与case后面的某一常量值相等时就执行此case后面的语句,若都不相等,则执行dafatul后面的语句;如果所执行的case后语句没有break关键字,则执行完后紧接着执行下一个case后的语句,直到遇到break跳出或程序结束。
注意:
- switch只能用于基本数据类型的整型数据,如int char short等,对于其他类型的只能用if else语句
- switch()中参数只能是整型数据
- case标签中只能时常量表达式,并且唯一,不允许重复,如4、‘a’或者'a'+1等
- dafatul不是必须,如果所有case匹配失败,则switch中什么也不执行,退出
#include<stdio.h>
int main()
{
int a=0;double b=0;
scanf("%d %lf",&a,&b);
switch(a) //switch(b)是错误的
{
case 1:printf("");
case 2+3:printf("");
case 'A':printf("");
case 9.5:printf(""); //错误,9.5不是整数
case a:printf(""); //错误,a是变量
case &a+10:printf(""); //错误,含变量
case "true":printf(""); //错误,不能含字符串
}
}
2.循环语句
在有循环语句的程序中,通常需要对循环条件进行初始化,并且在循环体中要有可以修改循环条件的语句,否则循环将成为死循环。
2.1while循环
#include<stdio.h>
int main()
{
while(循环条件)
{
语句块;
}
}
示例:
#include<stdio.h>
int main()
{
int i=1;
while(i<10)
{
printf("%d*%d=%d\n",i,i,i*i);
i++;
}
printf("\n");
return 0;
}
2.2do{ } while;
do{ } while;循环实质和while循环一样,只不过do{ } while循环先执行语句后判断,至少执行一次花括号内语句块。
#include<stdio.h>
int main()
{
do
{
语句块;
}while;
}
#include<stdio.h>
int main()
{
int i=1;
do
{
printf("%d*%d=%d\n",i,i,i*i);
i++;
}while(i<10);
printf("\n");
return 0;
}
2.3for循环
#include<stdio.h>
int mian()
{
for(表达式1;判断语句;表达式2) //表达式1通常对循环条件初始化,表达式2通常修改循环条件
{
语句块;
}
}
注意:
- 在for循环中,表达式可在循环之前定义,也可在内部定义,表达式2也可放在语句块后,但要在花括号内
- 在.cpp文件中for循环可这样写—for(int i=0;i<10;i++),在.c文件中int i;只能在循环之前定义,但可在内部赋值—int i;for(i=0;i<10;i++)
- 在for循环中任何情况下两个分号不能省略
#include<stdio.h>
int main()
{
for(int i=1;i<10;i++)
{
printf("%d ",i*i);
}
return 0;
}
#include<stdio.h>
int main()
{
int i=1;
for(;i<10;)
{
printf("%d ",i*i);
i++;
}
return 0;
}
以上两种代码等价;
2.4无限循环的使用
for( ; ; )
{
语句块;
}
while(1)
{
语句块;
}
在for循环中及时所有语句为空也要有分号,while循环中括号内参数必须有,括号内只要不为0,即为真则无限次执行。