目录
一、语句
在C语言中,语句分为五类,分别如下:
1、表达式语句(如3+2;6+10此类就叫表达式语句)
2、函数调用语句
3、控制语句
4、复合语句
5、空语句(;就叫做空语句)
简单讲讲C语言中的控制语句。控制语句用于控制程序的执行流程,以便实现程序的各种结构方式(C语言中的结构为顺序结构、循环结构、选择结构)。
C语言的九种控制语句分为三类:
1、分支语句: if语句,switch语句
2、循环执行语句:do while循环、 for循环、while循环
3、转向语句:break语句、goto语句、continue语句、return语句
注意:在C语言中,0为假;非0为真。
二、分支语句
2.1 if 分支
2.1.1 单分支if语句
单分支if语句的语法结构为:
if(表达式)
{
语句;
}
代码演示例子如下:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if (age > 18)
{
printf("成年了\n");
}
return 0;
}
2.1.2 双分支if语句
双分支if语句的语法结构为:
if(表达式1)
{
语句1;
}
else
{
语句2;
}
代码演示例子如下:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if (age > 18)
{
printf("成年了\n");
}
else
{
printf("还没有成年\n");
}
return 0;
}
2.1.3 多分支if语句
多分支if语句的语法结构为:
if(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
else
{
语句3;
}
代码演示例子如下:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if (age < 18)
{
printf("成年了\n");
}
else if(age>18 && age<= 50)
{
printf("青壮年了\n");
}
else
{
printf("你好\n");
}
return 0;
}
在书写if分支语句的时候,应该规范书写规范,防止出现else悬空现象
例如下班的代码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("hah\n");
return 0;
}
乍一看,输出值应当为haha;事实上这个输出值为没有任何输出;造成这样的原因是书写代码不规范导致的。所以在书写代码时候,我们应该规范书写。也提醒我们else 与它最近的那个if相匹配。
正确书写如下:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("heh\n");
}
else
{
peintf("hahha\n");
}
}
return 0;
}
下面是几个课后作业的练习题:
//判断一个数字是不是奇数:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if (num % 2 == 0)
{
printf("%d不是奇数",num);
}
else
{
printf("%d是奇数",num);
}
return 0;
}
2.2 switch分支
switch语句的书写方式为:
switch(整形表达式)
{
语句项;
}
在这里,语句项是一些case语句;如下:
case 整形常量表达式;
语句;
2.2.1 在switch语句中的break
#include<stdio.h>
int main()
{
int day = 0;
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;
default :
printf("输错啦;");
break;
}
return 0;
}
在switch语句中,case决定了入口,break决定了出口,并不是case后边一定要加break。但是一旦case后边加上了break,当结果满足这个case之后,程序会执行case里面的语句,遇到break之后,就跳出这个case。break的效果实际上就是把语句列表划分为不同的分支部分。
下面有一个代码展示了一些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;
default:
printf("输错啦;");
break;
}
return 0;
}
2.2.2 default子句
当switch表达式的值不匹配所有case标签的值时,default子句后面那的语句就会执行。default子句可以写在任何一个case标签可以出现的位置,每个switch语句只有一条default子句。
看看下面代码输出值为多少:
#include<stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default :
break;
}
printf("m=%d n=%d ",m,n);
return 0;
}
输出结果为m=5;n=3。在这里需要注意,语句里面没有break的时候,程序会继续往下执行。
三、循环语句
循环语句分为:while循环、for循环、do while循环三种。
3.1 while循环
while循环的语法结构为:
while(表达式)
{
循环语句;
}
以在屏幕上打印1到10的数字举例来看while循环的语法结构:
#include<stdio.h>
int main()
{
int i = 1;//初始化部分
while (i <= 10)//判断部分
{
printf("%d\n",i);
i++;//调整部分
}
return 0;
}
3.1.1 while语句中的break
看下面的代码示例:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
break;
}
printf("%d ",i);
i = i + 1;
}
return 0;
}
输出结果为:1 2 3 4 ;这是因为当程序中只要遇到break时,就停止后期的所有的循环,直接终止程序。所以在while循环中的 break,是用于永久终止循环的。
3.1.2while语句中的continue
看下面的代码:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d ",i);
i = i + 1;
}
return 0;
}
结果为1 2 3 4 +死循环;这是因为continue是用来终止本次程序的,continue之后的语句不会执行,会返回到while循环语句的判断部分,继续下一次循环的判断。在本例中,当打印i的值是4时候,往下执行i=i+1语句,i的值此时变为5;5小于10;进入while循环,然后5等于5,执行continue,程序又跑到判断部分,即5<=10处;然后就一直死循环了。
下面的代码执行情况就有所不同于上面的了:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
{
continue;
}
printf("%d ",i);
}
return 0;
}
在本例中,输出结果为2、3、4、6、7、8、9、10;造成这样的原因是因为程序执行到i=5处时;会进入if分支语句中,然后continue直接跳到while循环的判断部分,即i<=10这里。就没有打印5这个数字了。
可以使用while循环语句中的continue语句,打印数字字符,看下面代码:
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
{
continue;
}
putchar(ch);
}
return 0;
}
也就是说,当遇到输入字符时候,程序不输出任何值,只输出数字字符。
3.2 for循环
for循环的语法结构如下所示:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
其中:
表达式1是for循环的初始化部分;用于初始化循环变量
表达式2是for循环的判断部分;用于判断循环什么时候结束
表达式3是for循环的调整部分;用于循环条件的调整
运用for循环打印1到10的数字代码如下:
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ",i);
}
return 0;
}
3.2.1for循环与while循环的对比
for循环语句的结构如下:
for(初始化部分;判断部分;调整部分)
{
循环语句;
}
while循环语句的结构如下:
初始化部分;
while(判断部分)
{
调整部分;
}
从上面可以看出,for循环语句在结构上比while循环语句更加工整,更加美观。所以for循环使用频率更高。
3.2.2 for循环语句中的break
看下面的代码例子:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
{
break;
}
printf("%d ", i);
}
return 0;
}
输出结果为1 2 3 4 ;在这里程序打印4的时候, 会执行i++语句;然后i的值为5;因为5等于5,所以程序执行break,跳出整个程序,那么结果就自然只打印1 2 3 4了。
可以发现,for循环中的break和while循环中的break是差不多的。
3.3.3for循环中的continue
看下面代码:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
{
continue ;
}
printf("%d ", i);
}
return 0;
}
输出结果为1、2 、3、4、6、7、8、9、10;
这是因为当程序打印完4之后,会跳到i++位置处;此时i=5;然后执行if里面的判断,此时跳出后面的打印,来到i++位置处;i=6;依次往后打印。
在这里注意与while循环语句里面的continue区别开:
while循环语句中的continue是终止本次循环,跳转到while语句的判断部分。
而for循环语句中的continue是终止本次循环,跳转到for循环语句的调整部分。
3.3.4 for循环语句的一些其他例子
for循环语句中,初始化部分,判断部分,调整部分都可以省略,但是对于初学者,不推荐这样搞。如下:
#include<stdio.h>
int main()
{
for (;;)
{
printf("hello world\n");
}
return 0;
}
可以看到程序死循环打印hello world;原因是省略掉判断部分之后,判断部分恒为真;程序会死循环打印
还有在书写for循环语句时候,不建议省略掉初始化部分,判断部分,调整部分;例如下面两个代码;只是一个都初始化部分没有省略,一个初始化部分省略掉了,就会导致天壤之别:
代码1:
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("hello world\n");
}
}
return 0;
}
代码2:
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("hello world\n");
}
}
return 0;
}
可以看到代码2 的两个for循环中的初始化部分都省略掉了,然而代码1里面的没有省略掉,所打印出来的结果为第一个打印9个hello world;第二个打印结果为3个hello world;所以在书写代码时候,在不完全理解的情况下,不太建议省略for循环里面的三个限制条件(初始化部分、判断部分、调整部分)。
3.3 do while循环
do while 循环的语法结构为:
do
{
循环语句;
}
while(表达式)
do while循环是至少执行一次;但是因为使用场景有限,所以不经常使用。
使用do while循环打印1到10的数字;如下:
#include<stdio.h>
int main()
{
int i = 0;
do
{
i = i + 1;
printf("%d ",i);
} while (i < 10);
return 0;
}
3.3.1do while循环语句中的break
看下面代码:
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
{
break;
}
printf("%d ",i);
i = i + 1;
} while (i<=10);
return 0;
}
输出结果为1 2 3 4 ;可以发现,do while循环中的break;和for循环语句;while循环语句差不多;
都是终止循环,直接退出程序。
3.3.2 do while 循环语句中的continue
看下面代码:
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (5 == i)
{
continue;
}
printf("%d ",i);
i = i + 1;
} while (i<=10);
return 0;
}
发现这个也和while循环语句中的continue差不多;便不再做过多叙述。