语句:由一个分号隔开的一行或多行代码称为一个语句
C语言是结构化的程序设计语言,存在三种结构。分别是顺序结构、选择结构和循环结构,顺序结构是按照代码顺序执行语句,因此不再赘述,下面主要介绍选择结构和循环结构。
选择结构
具有选择结构的语句叫做选择语句,又叫分支语句
if else
可以实现多种分支
单分支 | if |
---|---|
双分支 | if - else |
三分支 | if - else if - (else) |
多分支 | if - else if - else if - else if - … - (else) |
如果if 或者 else语句需要控制多条语句,需要使用代码块{ }
如下代码的执行结果是什么呢?
int a=0;
int b=0;
if(a==1)
if(b==2)
printf("hehe\n");
//if和最近的else匹配
else
printf("haha\n");
//a!=1,所以不进循环,直接return 0;
return 0;
如上代码告诉我们,一定要注意代码书写规范
if else并不是书面上对齐即匹配,而是采用就近原则匹配
switch
在switch语句中,case后面必须是整型常量表达式。
代码1:输入数字1~7对应输出星期一到七
switch(day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期7\n");
break;
default:
printf("输入错误\n");
break;
}
在switch语句中,case是入口,break是出口,因此case后面要有break,default后面也要有break,但并不是说每个case后面都必须要加break,要根据情况而定。
代码2:输入1-5打印工作日,输入6-7打印休息日
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
循环结构
具有循环结构的语句叫做循环语句。
while循环
int i=0; //初始化
while(i<10) //判断
{
i++; //调整
}
continue和break的区别:
continue跳出循环
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
break终止循环
for循环
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:初始化部分,初始化循环变量
表达式2:条件判断部分,判断循环什么时间终止
表达式3:调整部分,用于循环条件的调整
对for语句的循环控制变量的一些建议:
1、不可在for循环体内修改循环变量,防止for循环失去控制,例如:
int i=0;
for(i=0;i<10;i++)
{
//给 i 赋值5,会导致程序陷入死循环
if(i=5)
printf("haha\n");
printf("hehe\n");
}
2、建议for语句的循环控制变量的取值采用“前闭后开区间”写法
for (i = 0; i<10; i++) // 前闭后开
for (i = 0; i <= 9; i++) // 前闭后闭
上述两种方法都没什么问题,比较好的是采用前者
注意:for循环的初始化、调整、判断都可以省略,但是如果for循环的判断部分被省略,那判断条件就恒为真,陷入死循环;如果不是非常熟练,建议不要随便省略
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}
代码1:如下代码会打印出几个hehe
int main()
{
int i=0;
int j=0;
for(;i<10;i++)
{
for(;j<10;j++)
{
printf("hehe\n");
}
}
}
答案:打印出10个hehe
解析:因为当i=0时,进入内循环,j从0循环到9,总共10次,打印10个hehe
当j=10时,退出内层循环;
进入i=1的外循环,但此时j=10,判断条件为假,不会进入内循环,直至循环结束。
代码2:如下代码循环几次
int x = 0;
int y = 0;
for (x = 0, y = 0; x<3 && y<6; x++, y++)
printf("hehe\n");
答案:循环3次,因为是逻辑与,满足x=3即退出for循环
代码3:如下代码循环几次
int x = 0;
int y = 0;
for (x = 0, y = 0; x<3 || y<6; x++, y++)
printf("hehe\n");
答案:循环6次,因为是逻辑或,同时满足x=3,y=6退出for循环
代码4:如下代码循环几次
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
printf("hehe\n");
答案:循环0次,k=0 是赋值,不是判断相等
如果判断条件永远恒为真,就会陷入死循环 。
代码4变形:如果是k==0,则循环1次
int i = 0;
int k = 0;
for (i = 0, k = 0; k == 0; i++, k++)
printf("hehe\n");
do while循环
do
循环语句;
while(表达式);
int i = 0;
do
{
printf("%d ", i);
i++;
}
while (i < 10);
goto语句
可以随意跳转
int main()
{
again:
printf("hello world!\n");
goto again;
return 0;
}
for()
for()
{
for()
{
if (disaster)
goto error;
}
}
error:
if (disaster)
上述情况如果没用goto语句,需要三次break才能跳出三个for循环。