分支语句
一、if语句
语法结构
//单分支
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
***注意:表达式的值只有0和非0两种情况(不是0和1),0表示假,非0表示真。
1.单分支语句:例如,比较两个整数10和20,输出较大值。
void main()
{
int a = 10;
int b = 20;
int max_value;
if (a > b)
max_value = a;
else
max_value = b;
printf("max value = %d\n", max_value);
}
***注意:悬空else,类似于下面结构的代码,此时输出的结果为空,因为else虽然是和外层if对齐,但是会先和内部最近的if进行匹配。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0; }
2.多分支语句:例如,判断某一年某一月有多少天。
void main()
{
int year, month;
printf("year and month:>");
scanf("%d %d", &year, &month);
if(month<1 || month>12)
{
printf("输入的月份有误,程序结束.\n");
return;
}
int days = 0;
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
days = 31;
else if(month == 2)
{
if((year%4==0&&year%100!=0) || (year%400==0))
days = 29;
else
days = 28;
}
else
days = 30;
printf("%d年%d月有 %d 天.\n", year, month, days);
}
二、switch语句
语法结构
switch(整型表达式)
{
case 整型常量表达式:
语句;
}
在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支,break语句的实际效果是把语句列表划分为不同的部分。
如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结果就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在C语言中并不认为是错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?可以在语句列表中增加一条default子句,把下面的标签
default:
语句;
写在任何一个case标签可以出现的位置。当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句,但是它可以出现在语句列表的任何位置,而且语句流会像贯穿case标签一样贯穿整个default子句。
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++; //m = 3
break;
case 2:
n++; //n = 2
break;
case 3:
m++; //m = 4
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
例如:
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
***注意:如果不加break语句,该程序func(1)得到结果为0,因为当前case执行结束后,会继续执行紧跟case中的语句。在调用func时形参a的值为1,switch(a)<==>switch(1),此时case 1被命中,因为该switch语句中所有分支下都没有增加break语句,因此会从上往下顺序执行,最后执行default中语句返回。
循环语句
一、while语句
//while 语法结构
while(表达式)
循环语句;
例如,在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d",i);
i = i+1;
}
return 0;
}
while语句中break和continue的用法
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
/*
输出结果:1 2 3 4
*/
//continue 代码实例
#include <stdio.h>
int main()
{
int i = 0;
while(i<10)
{
i = i+1;
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
/*
输出结果:1 2 3 4 6 7 8 9 10
*/
break在while循环中的作用:
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
continue在while循环中的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接
跳转到while语句的判断部分,进行下一次入口的判断。
二、for语句
//语法结构
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环时候终止。 表达式3为调整部分,用于循环条件的调整。
例如,在屏幕上打印出1-10的数字。
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
for循环相较while循环,其循环的三个条件先紧凑,更容易集中查找和修改,同时也能够更好的得到循环次数。同时在for循环中,break和continue的用法与while语句中的用法类似,意义是一样的。
在for循环中循环控制变量的取值建议采用“前闭后开区间”写法,这样能方便查看循环次数。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
三、do while语句
//语法结构
do
循环语句;
while(表达式);
do语句的特点:先执行再判断,故循环至少执行一次,使用场景有限,使用次数不多。
do while语句中的break和continue:
#include<stdio.h>
int main()
{
int i = 1;
do
{
if(5 == i)
break;
printf("%d\n", i);
i = i+1;
}while(i<10);
return 0;
}
/*
输出结果为:1 2 3 4
*/
#include<stdio.h>
int main()
{
int i = 0;
do
{
if(5 == i)
continue;
printf("%d\n", i);
i= i+1;
}while(i<10);
return 0;
}
/*
输出结果为:1 2 3 4 6 7 8 9 10
*/