分支语句和循环语句作为C语言中的控制语句,在C语言中有着举足轻重的地位。
1.分支语句
1.1 if语句
if语句的语法结构
语法结构:
//单分支
if(表达式) //表达式中,当为0时,为假,不执行这个语句;当为非0时(1,2,-1...),为真,执行语句。
语句;
//双分支
if(表达)
语句1;
else
语句2;
//多分支
if(表达)
语句1;
else if (表达式)
语句2;
else
语句3;
关于if语句的实例:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age > 18)
printf("成年啦");
else if(age < 18)
printf("未成年");
return 0;
}
关于if语句有几点说明:
1.if可以单独出现,不一定要和else,else if同时出现。
2.if()括号中如果有多个条件,用&&或||操作符连接起来。当条件既要小于200又要大于100时,千万不能写成100<a<200,因为那样的话,当输入的a小于100时,100<a就为0(假),0又恒小于200,所以这个语句会被执行。应该写成 a>100 && a<200的。
3.当有多个语句时,一定要用代码块,类似于下面这样,因为这样会增加代码的可读性,而且最重要的是,else是会和与靠它最近的else if配对,并不是哪个else if与它对齐它才和哪个匹配。
if(a<100)
{
printf("%d\n",a);
printf........
}
4.if后面的()中,如果表示的是某种相等的情况,那么一定是==,而不是=。如果不小心写成了=,程序以后会执行这个语句,不会报错,但就达不到我们预期的效果了。为了避免这种情况,我们可以将常量放在左边,右边是变量,例如:if(5 == b),因为这样我们一旦只打了一个=,编译器就会报错,因为不能给常量赋值。我们就可以很快的知道程序在哪里出错了,省去了找BUG的时间和精力。
(这样他就会打印5,而我们并不想让它打印东西。)
1.2 switch语句
switch语句常运用于多分支语句时。switch的语法结构:
switch(整型表达式)
{
case 1:
语句1;
case 2:
语句2;
......
}
有如下的实例:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("周一");
case 2:
printf("周二");
case 3:
printf("周三");
case 4:
printf("周四");
case 5:
printf("周五");
case 6:
printf("周六");
case 7:
printf("周日");
}
}
关于switch有如下说明:
1.switch后面括号应该是整型表达式,可以是int,char,long,short类型的。但不支持float类型。case后面也应为整型常量表达式。也就是说表达式要在之前声明初始化。
2.如上图实例,如果day为1,那么周一~周日都会被打印出来。我们只想打印一个的话,就要在每个语句后面写break。加不加break据情况而定。如果不加break,他会从进入的语句一直走下去,直到这个代码块结束:。
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("周一");
break;
case 2:
printf("周二");
break;
case 3:
printf("周三");
break;
case 4:
printf("周四");
break;
case 5:
printf("周五");
break;
case 6:
printf("周六");
break;
case 7:
printf("周日");
break;
default:
printf("出错了~");
}
}
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday");
break;//打印工作日
case 6:
case 7:
printf("weekend");
break;//打印周末
default:
printf("出错了~");
break;
}
}
3.switch语句中有default子句,它的作用和if中的break相类似,是为了给条件与case中都不匹配的语句所使用的,增加了程序的完整性。default语句没有位置限制。
#include<stdio.h>
int main()
{
int day = 0;
switch(day);
{
case 1:
printf("周一")
case 2:
printf("周二")
case 3:
printf("周三")
case 4:
printf("周四")
case 5:
printf("周五")
case 6:
printf("周六")
case 7:
printf("周日")
default:
printf("出错啦,您输入的不在范围之内~")
}
}
2.循环语句
2.1 while循环
while的语法形式:
while(条件)
{
循环部分
}
while的实例:
当while后面的语句为真时(非0),就会一直循环下去。这段代码运行起来会打印0~9。我们可以根据我们的需要设计条件达到我们的需求。
while中的break,continue:
在这里我们需要注意,while中的break和continue出现时,往往是伴随着if语句的,if语句可以嵌入到while循环中。
break:
#include<stdio.h>
int main()
{
int a = 0;
while (a < 10)
{
printf("%d\n", a);
if (5 == a)
break;
a++;
}
}
说明:当a为5时,执行break语句跳出while循环--循环终止。程序运行起来只会打印0~5,而不是像上面的程序一样打印0~9。break的作用就是如此。
continue:
#include<stdio.h>
int main()
{
int a = 0;
while (a < 10)
{
printf("%d\n", a);
if (5 == a)
continue;
a++;
}
}
说明:和上面的代码不同,break变成了continue。运行结果大有不同。它还会打印0~5,但打印到5后程序不会跳出while循环了,而是无穷尽地打印5。continue就是当满足条件时,跳过后面的语句重新回到循环头部,满足if的条件,又回到循环头部,从而不停地循环。
2.2 for循环
for循环语法形式:
for(初始化部分;判断部分;调整部分)
{
循环内容
}
for循环的实例:
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
{
printf("%d\n",i);
}
return 0;
}
在这里我们需要注意的是i++是每次代码块里的程序运行完后才会执行的。
for中的break,continue:
break:
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
{
if ( 5 == i )
break;
printf("%d\n",i);
}
return 0;
}
和while中的break一样,当满足条件后,执行break语句,跳出循环,只打印出1~4。
continue:
int main()
{
int i = 0;
for (i = 1; i < 10; i++)
{
if ( 5 == i )
continue;
printf("%d\n",i);
}
return 0;
}
for循环中的continue与while中的continue不太相同。当while中开始执行continue时会一直死循环下去,而for中却不是,我们运行这段代码可以发现,他打印了1~9(中间没有打印5),这是因为当i等于5时,执行continue语句(下面的程序不再执行)回到for循环头部,又执行了i++,这时5加1等于6,所以不满足if条件,可以往下循环。而while中的i++没有在循环头部,而在下面的程序中,所以一直满足条件死循环下去。
for循环的几点说明:
1.不推荐判断条件带等号(前闭后开),提高程序可读性;
2.不可在循环体内部修改循环变量,防止循环混乱;
3.for的初始化、判断条件、调整部分可以为空:for(;;);(不建议省略,理由如下)
int main()
{
int i, j = 0;
for (i = 0; i < 3; i++)
{
for(j = 0; j<3; j++)
printf("hehe\n");
}
return 0;
}
在这时我们根据代码可知他打印出9个hehe。当我们把第二个for循环中的 j=0 省略时,他就只能打印三个hehe了。 这是因为在第一个for循环第一次时第二个for循环中j的已经变成了3,当我们去掉j=0的初始条件时,j就不会被初始化了,j就是3,所以在第二次进入循环时,不满足条件不再打印hehe。我们可以看到当我们随意省略for循环中的某一部分时,可能会得到与我们的期望不相符的程序,造成不必要的麻烦,所以最好不省略。
4.控制for循环的变量可以是多个。
来看个代码,各位老铁们可以看看它打印几次a。(可以在文章底部参与投票哦~)
int main()
{
int a, b = 0;
for (a = 0, b = 0; a = 0; a++, ++b)
printf("%d\n",a);
return 0;
}
2.3 do...while循环
do...while循环语法形式:
do
{
循环内容
}while(判断条件);
do...while循环实例:
int main()
{
int a = 0;
do
{
printf("hehe\n");
a++;
}while(a < 10);
return 0;
}
do...while中的break,continue:
break:
int main()
{
int a = 0;
do
{
if( 5 == a )
break;
printf("hehe\n");
a++;
}while( a < 10 );
return 0;
}
和while,for中的break相同,符合条件后终止循环。
continue:
int main()
{
int a = 0;
do
{
if( 5 == a )
continue;
printf("hehe\n");
a++;
}while( a < 10 );
return 0;
}
道理和while中的continue相同,运行出来的结果是四行hehe后面还有一个光标不停地闪烁,这是因为程序仍然在不断执行。没有像while中的那个例子无穷地打印,是因为printf函数放的位置不同,一个在continue上,一个在continue下。这个在continue下,因此前面不满足条件时打印了四行hehe,当满足条件后,不再执行下面的语句,回到while,继续执行do里面的程序。因此程序仍在无休止地运行着只是我们看不到。
关于do...while循环的说明:do..while循环会先执行一次,无论符不符合while中的条件。