趁热打铁啊。写完该系列第一篇博客我就来劲了,迫不及待地开始第二篇。我自认为我第一篇文章写地不错,内容详细,配图认真,大家感兴趣可以点击链接上面往期文章支持一下。也欢迎大家批评指正。接下来我们开启第二篇文章,主要来介绍分支语句很循环语句。欢迎大家多多支持。
C语言中由一个分号 ; 隔开的就是一条语句。
所以,我们这个专栏的名字是:以分号结尾的诗。
如果只有一个分号是空语句。
printf("nihao");
1+2;
;
这就是需要选择结构的情况。
那么,我们如何实现选择语句呢?我们有if语句和switch语句。
表达式结果为真,则条件成立,反之则代表着条件不成立。
我们来看一个例子:
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age<18)
{
printf("未成年\n");
}
return 0;
}
大家注意,如果if语句后不加{},那么其后只有一条语句可以被if作用,如果if后要被if作用多条语句,一定要加{}。举一个例子。
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age<18)
printf("未成年\n");
printf("不可以抽烟喝酒\n");
printf("不可以结婚\n");
return 0;
}
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
printf("不可以抽烟喝酒\n");
printf("不可以结婚\n");
}
return 0;
}
大家明白{}的作用啦嘛。{}里面才是一个代码块哦。所以为了防止出错,我们建议全部跟上{}。
所以多条语句的正确书写格式为:
#include
int main()
{
if (表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
if还有一个好搭档——else。else的作用不容小觑,我们一起来看看。
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
else后{}的作用同if一样。
但是有些时候,一对if、else难以解决问题,此时,我们就需要多分支语句啦。也就是要用到else if。
#include
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if (age >= 30 && age < 50)
{
printf("中年\n");
}
}
接下来,我们研究一个问题,这段代码会输出什么?
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
是呵呵呢还是哈哈呢?见证一下:
输出的是空空哦。
惊不惊喜?意不意外?为什么是这样呢?
因为else和其上面最近的if匹配
我们将格式调整一下就可以看地更明显:
这也告诉我们,良好的代码风格很重要,会给人清晰明了的舒服感。所以,大家写代码的时候,要注意代码风格哦。
还有一个小细节,也值得我们注意,我们看下面这样一个例子,如果我们想要写一个代码,希望当b=2的时候,输出hehe,但是由于我的马虎,只写了一个等于号,我们知道,==在c语言中,一个等于号是赋值,两个等于号才是相等。==此时程序是这样的:
#include
int main()
{
int b = 0;
if (b = 2)
printf("hehe\n");
return 0;
}
我们的程序写错了,与我们的本义是不符合的。但是屏幕上却输出了hehe。这是因为:
所以,一个赋值表达式是真,也就是一个非0数,所以可以执行。那么,面对这样不易察觉的错误,我们有没有什么好的办法避免呢?我们将代码换一种写法来看看:
我们将2和b换了一下位置,我们发现编译器报错了,我们就很容易察觉到,这里少写了一个等于号。所以这提示我们,if括号里判断变量是否等于一个数字这种情况,我们把数字写在前面,这样有助于我们检查错误。这也同样提示了我们,代码风格的重要性。
switch语句也是一种分支语句。 常常用于多分支的情况。
我们来看这样一个例子:
如果我们用if、else语句,将会非常的麻烦,对于这种多分支情况,switch语句会有条理方便很多。我们来看一下switch语句的应用方法:
switch(整型表达式)
{
语句项;
}
语句项是:
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
case语句搭配break来使用,case进入,break跳出。
于是上面星期的代码我们可以写成这个样子:
#include
int main()
{
int day = 6;
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;
}
return 0;
}
注意,switch括号内放地是整型表达式哦。如果我们将day设置成float,代码就无法运行了。case后面必须要跟整型常量表达式。字符的也是整型常量,因为字符型对应的ASSIC码是整型。
我们说case和break搭配,但是是每一条case后,都要加break吗?非也。
如果我们改变一下需求:
我们的代码就可以改为这样来实现:
#include
int main()
{
int day = 6;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
所以,我们知道,并不是case后一定跟break,而是根据需要添加break。
但是,我们再想一下,如果,我们输入的数字超出范围了怎么办?比如,我们让day=9。
#include
int main()
{
int day = 9;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
这下啥也没输出。所有语句都被跳过了。有的时候,我们不希望发生这样的错误,所以我们就需要一点提示,于是default语句就对我们很重要啦。
#include
int main()
{
int day = 9;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("您输入地信息有误\n");
}
return 0;
}
所以,为了成为一名严谨的程序员,在需要的时候要加上default语句哦。
还有一点值得注意的是,switch内部的语句并没有严格的顺序,所以代码变成这样也是可以的哦:
#include
int main()
{
int day = 9;
switch (day)
{
default:
printf("您输入地信息有误\n");
case 6:
case 7:
printf("weekend\n");
break;
return 0;
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
}
}
关于循环语句,我们之前在第一篇文章里以开端为例,已经比较详细地介绍啦,大家可以翻看一下第一篇博客哦。
//while 语法结构
while(表达式)
循环语句;
我们来看一个while循环的简单实例:
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
同样,在while循环中我们也引入了break。
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}
#include
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
综上,我们知道,==break是中止循环,进入下一条语句,而continue是结束本次循环进入下一次循环。==这个非常重要,大家一定要注意它们的区别。对于新手小白,可能要花一段时间来弄明白这二者之间的区别,对于老手,也要注意它们的区别,不要马虎犯错。
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环时候终止。 表达式3为调整部分,用于循环条件的调整。
#include
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
我们对比一下while循环和for循环:
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。
break和continue在for循环中区别和while中相同。
注意两点:
同时,for循环的三个条件是可以有缺失的。也可以有如下变种。
#include
int main()
{
//变种1
for (;;)
{
printf("hehe\n");
}
//变种2
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
像变种1这样的写法,将无限循环,我们不建议这么做。
do
循环语句;
while(表达式);
do循环上来不做任何判断,所以循环至少执行一次。
来看一个do while的循环的例子:
#include
int main()
{
int i = 0;
do
{
i++;
printf("%d\n", i);
} while (i<10);
return 0;
}
同理,break和continue的语法在do while中也是一样的。
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
适用于下面这种情况:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况