语句整理
一、分类
1.条件判断语句:
if语句;switch语句
2.循环执行语句:
while语句;do…while语句;for语句
for语句较为常用
3.专向语句
break;goto;continue;return
一般配合前面语句使用,实现特殊用法
二、if语句
1.作用
对表达式内容进行判断,表达式为真则执行语句,表达式为假则不执行。
#include <stdio.h>
int main()
{
int num = 5;
if(num > 10)
printf("%d",num)
else
printf("%d",num + 1)//输出结果为6
retutn 0;
}
2.格式
注:
1.if语句后单条语句可不加{},但有多条语句时必须加{},否则只会运行其中一条语句
2.else if和else后有多条语句时也需要加{}
3.else后面可不加表达式条件
4.VS有时if语句会报警告不是所有控件路径都返回值,需要在if语句后加一个else及return 0,如下:
这是由于if…else语句有未包含的情况
3.if嵌套
if语句嵌套进行多层分支选择
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
if(a = b && a = c)//第一个if
printf("%d = %d = %d",a,b,c)
if(a >= b)//第二个if
{
if(c >= a)//第三个if
printf("%d %d %d",c,a,b);
else if(c <= b)
printf("%d %d %d",a,b,c);
else//c<a && c>b 第一个else
printf("%d %d %d",a,c,b)
}
else//第二个else
{
if(c >= b)//第四个if
printf("%d %d %d",c,b,a);
else if(c <= a)
printf("%d %d %d",b,a,c);
else//c>a && c<b 第三个else
printf("%d %d %d",b,c,a);
}
return 0;
}
进行多层嵌套时,else一般匹配最近的一个if,但是如果有 { } 则同一个括号内的相互匹配。例如第三个 if 和第一个 else 匹配,第四个 if 和第三个 else 匹配,因为他们都位于同一个括号内。第二个 if 和第二个 else 匹配,因为在同一优先级下第二个 else 离第二个 if更近。
4.注意事项
4.1 使用语句进行判断时不要使用连续比较(如 10<a<20)
计算机进行在比较完前两个数后会得出此表达式的结果为0(假)或1(真),再用前两个数的结果和后一个数比较,故代码达不到预期效果
需要注意C语言中规定真为非0,假为0,所以并不是所有结果真都为1
#include<stdio.h>
int main()
{
int num = 20;
if(25 < num < 30)//结果为20,25<num结果为假等于0,0<30,结果为真,运行后面语句
printf("%d\n",num);
if(25 < num == 0)
printf("%d\n",num + 1);//结果为21,证明判断为假时结果为0
if(10 < num == 1)
printf("%d\n",num + 2);//结果为22,证明判断为真时结果为1
return 0;
}
不仅if函数,所有语句在使用时都需要注意这个问题
所以在有连续比较时,通常分次比较并以&&连接
if(num >10 && num < 30)
printf("%d",num);
4.2 if语句无法用break之类的结束,但当希望运行到当前if语句判断为真时结束当前函数,可以用return跳出。
#define _CRT_SECURE_NO_WARNINGS//VS中scanf会报错,加此句使其忽略这个错误
#include<stdio.h>
void print(int a, int b, int c)
{
if (b > c)
return;//跳出函数
printf("%d*%d =%2d ", a, b, a * b);
if (a >= b)
{
a = 1;
b++;
printf("\n");
}
else
a++;
print(a, b, c);//函数递归
}
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);//a、b确定起始位置,c确定范围
print(a,b,c);
return 0;
}
三、switch语句
1.作用
根据switch后的整形表达式确定运行后面哪一个语句
#include<stdio.h>
int main()
{
int a = 0;
switch(a)
{
case 0 :
printf("%d",a);//运行结果为0
break;
case 1 :
printf("%d",a + 1);
break;
default :
break;
}
return 0;
}
2.结构
switch(整形表达式)
{
case (整形) :
语句;
break;
default :
语句
break;
}
3.switch嵌套
switch可以嵌套使用
#include<stdio.h>
int main()
{
int m = 1;
int n = 2;
switch(m)
{
case 1 :
n++;//m=1,n=2,此句运行后n=3
case 2 :
m++;//m=1,n=3,此句运行后m=2
case 3 :
switch(m)//m=2所以进入case2
{case 1 :
n++;
case 2 :
m++;//m=2,n=3,此句运行后m=3
n++;//m=3,n=3,此句运行后n=4
}
case 4 :
n++;//m=3,n=4,此句运行后n=5
}
printf("%d %d ",m,n);//m=3,n=5
return 0;
}
注:
1.case和后面的整形之间必须加空格,若不加空格则无法通过switch后的整形表达式找到相应的case语句:
case1(错误)------ case 1(正确)
2.switch必须加 { }
3.不能用n+1代替n++,但可以写成n=n+1,因为n++为一个表达式语句,而n+1为一个表达式,不是语句,无法执行
4.没有break则case会按顺序执行下去
5.switch语句中最后要加default,前面所有case语句都不满足时执行default语句
4.break在switch中的用法
4.1 switch中的break放在case语句后,建议每一个case都放break,否则会从满足条件的case语句开始,一直执行到最后一个语句,见上述代码。
4.2 当有多个相同含义的case时,可以只在分界的case处放break。
#include<stdio.h>
int main()
{
{int day = 0;//假设输入1——7的数字,输出星期1——7
scanf("%d", &day);
//每一个case有单独的break
switch(day)
{case 1 :
printf("星期一\n");
break;
case 2 :
printf("星期一\n");
break;
//……中间剩余时间省略
case 6 :
printf("星期六\n");
break;
case 7 :
printf("星期天\n");
break;
default ://提醒输入非1——7的数字
printf("输入错误\n");
break;
}
//多个case共用一个break
switch(day)
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
printf("工作日\n");
break;
case 6 :
case 7 :
printf("休息日\n");
break;
default ://提醒输入非1——7的数字
printf("输入错误\n");
break;
}
return 0;
}
四、while语句
1.作用
1.1 在while语句范围内,通过判断while后的表达式是否为真决定while后的语句是否执行。每次执行完成后会返回while判断处,如果为真会再次执行。所以while语句内会有一个判定条件,判定条件决定循环是否继续执行,否则while语句会陷入死循环。
1.2 判定条件一般包括在while语句内赋一个判断值或者使用break语句;判断值即为while后的表达式内的值,可通过在语句内部改变判定数值,保证循环有终点,break则是永久终止循环。
2.结构
break用于永久终止循环;
continue用于跳过本次循环后面的代码。
3.break和continue用法
3.1 break通常可以配合其他判断语句(如if语句)使用,以达到想要的效果
#include<stdio.h>
int main()
{
int i = 0;
while(i < 10)
{
if(5 == i)
{
break;
}
printf("%d ", i);//结果为0 1 2 3 4
i++;
}
return 0;
}
- 上述中的 i 就是一个判定值,在break不执行的情况下,i 达到条件时也会终止循环,i++即是对判定值在语句内部的更改;
- break在达到 i = 5的条件时便会运行,此时打印出1-4后,便不会继续打印;另外在代码中需使用= =表示等于,若只使用1个则为赋值,会直接执行break,不会往后执行
- 在不运行break时while后循环会执行n次,while会执行n+1次,因为循环最后一次后会在去while进行判定
3.2 continue通常也是配合条件语句使用,需要注意的时continue跳过后面代码后还是会继续执行循环语句,这是需要和break区别开的。
#include<stdio.h>
int main()
{
int i = 0;
while(i < 10)
{
a++;//必须在continue前面
if(5 == i)
{
continue;
}
printf("%d ", i);//结果为1 2 3 4 6 7 8 9 10
}
return 0;
}
- 当使用continue时需要注意判定值不能在continue后面,否则会导致语句陷入死循环
五、for语句
1.作用
常用的循环句式,使用方便,嵌套也比较方便。
2.结构
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1是初始化值,决定开始位置;
表达式2是条件判断,决定结束位置;
表达式3是调整部分,决定判定值变化;
在使用for循环时,表达式之间需以 ”;“ 隔开
for后只有一条语句可不加 { } ,有多条则必须加 { }
#include<stdio.h>
int main()
{
int i = 0;
for(i = 0;i < 10;i++)
{
printf("%d ", i);
}
return 0;
}
在表达式1进行变量初始化:for(int i = 0; i < 5; i++) 部分编译器可能不支持此种写法,所以不建议在表达式内部初始化
3.for循环的使用及循环嵌套
3.1 for后的三个表达式很重要,其内部的内容可以省略,写成 for( ; ; ),此为一个死循环语句,也可只省略判断语句,意为判断恒成立
int i = 0;
for(;;)
printf("%d",i);死循环打印0
for(i = 0; ;i++)
printf("%d",i);//死循环打印i++
需要注意如上同时使用两个死循环for语句时,只有一个for能被执行
3.2 for循环可用多个变量控制循环
int x = 0, y = 0;
for(x = 0,y = 0; x < 5 && y < 2; x++,y++)
printf("%d %d ",x,y);//结果为0 0 1 1
3.3 当判定条件为赋值语句时,循环次数可能为0次或无限次,为等于会运行1次,且结果正确才会运行
int i = 0,j = 0;
for(i = 0; i = 0;i++)
printf("%d ",i);
//i=0意为将0赋值给i,i=0结果为假,故此语句不会运行
for(j = 0; j = 5;j++)
printf("%d ",j);
//j=5为赋5给j,j=5结果为真,运行结果会死循环打印5
for(i = 0; i == 0;i++)
printf("%d ",i);
//j==0为判断语句,j!=0时结果不运行,本次只会运行1次,结果为0
for(j = 0; j == 5;j++)
printf("%d ",j);
//j==5为判断语句,结果为false,不运行
3.4 for循环嵌套时,外层运行一次,内层运行所有循环次数
int i = 0,j = 0;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
printf("");
}
一共会打印9个“打印+1”,当 i= 0 第一个for运行第一次,进入第二个for运行 j=0,1,2共三次;当 i=1 第一个for运行第二次,进入第二个for,j 被初始化为0,所以 再次运行 j=0,1,2共三次。因为 i<3 共有3个值,故一共会运行9次。
3.5 for嵌套使用时,如果省略初始化值会影响内层值
int i = 0,j = 0;
for(;i < 3;i++)
{
for(;j < 3;j++)
printf("i=%d,j=%d\n",i,j);
//运行结果:
//i=0,j=0;
//i=0,j=1;
//i=0,j=2;
}
i = 0进入第一个for运行一次,进入第二个for运行3次后第四次 j = 3跳出本循环;i = 1第二次进入第一个for循环,当运行至第二个for循环时,因为没有初始化,j 的值为前面得出的3,不满足j<3,跳出本循环,i=2第三次进入第一个for循环,重复步骤。
可知本次for循环的出的结果只是第一次得出的,后面两次未能进入打印,未得出结果。
六、do…while语句
1.作用
先运行在进行判定,和while和for循环不同的是,do…while循环可以不用限定一个范围,而可以通过键入一个0或非0的命令决定循环是否继续。
int i = 0;
do
{
print(" 0 = 退出 ");
print(" 1 = 继续 ");
scanf("%d", &i);
}while(i);
通过此种方式可以自己控制循环是否继续。
2.结构
do
循环语句;
while(表达式);
当do后面只有一条语句时可以不加 { } 但是有多条语句时必须加 { } ;
七、其他语句
1.goto语句
作用: 跳转到符号位置,滥用goto语句可能造成错误,所以要尽量少写goto语句
注意: goto语句是无法跨函数跳转的
again:
printf("打印");
printf("循环");
goto again;//goto语句写成的死循环
2.return、break、continue
return: 用于函数返回一个值或者函数中分支语句结束跳出执行。
return关键字终止其出现的函数的执行,并将控制(以及表达式的值(如果给定))返回给调用函数。默认情况下,函数返回一个整数值。要定义其他类型的返回值,函数的名称前面是类型。如果函数的类型为void,则会省略return语句。
break: 用于永久终止一个循环
continue: 用于跳过一个循环后面的代码,使用continue时需注意循环的判定条件变化不能放在continue后面,否则会造成死循环。