C语言基础之分支和循环的介绍
一、什么是语句?
C语言语句分为一下五类
1、表达式语句
2、控制语句
3、函数调用语句
4、复合语句
5、空语句
本章我们主要介绍控制语句。所谓控制语句,即为控制程序的进行流程,以达程序员所期的结果。C语言是一门结构化的程序语言,结构化的C语言支持三种结构:顺序结构,选择结构与循环结构。本章我们将讲述选择结构与循环结构的使用。
二、分支语句(循环结构)
1、if语句
(1)if的三种语法结构
1、
if(表达式)
语句;
2、
if(表达式)
语句1
else
语句二;
3、
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");
}
return 0;
}
//代码二
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("已成年\n");
}
return 0;
}
//代码三
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else if(age<30)
{
printf("成年\n");
}
else if (age < 50)
{
printf("壮年\n");
}
else if (age < 60)
{
printf("中老年\n");
}
else
{
printf("老年\n");
}
return 0;
}
以上便是三种使用的实例,可以看到,每个if和else判断之后都加上了{},其实对于单个语句的话,{}是可以不加的,但是对于多条语句的话,{}是一定要使用的
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年,");
printf("好好学习\n");
}
return 0;
}
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("未成年,");
printf("好好学习\n");
return 0;
}
//当你的输入结果是age<18时,第一段代码会输出未成年,好好学习
//而下面的代码只会输出未成年,
(2)else的使用
对于else这个语句的用法,我想先考大家一个题目,请问下面的代码输出结果是什么?
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
答案是haha。这个else看起来与第一个if对齐,应该与其配对。而实际上,*else是遵循就近配对的*
所以else实际上是与第二个if配对,故输出结果是haha。
刚刚我们提到了{},在这段代码中,如果我们合理运用{},便可将代码改写为这种形式
#include<stdio.h>
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(表达式)的表达式内使用错误符号吧将if(a==1)写作if(a=1)是非常常见的错误。
对于这种错误,编译器可能会在调试时报错,也可能不会,这里可以给大家提供一种方法,以减少这种情况导致的错误那
就是将变量和常量位置互换,写成(1==a),如果换位之后,你正确的使用了==,那么便不会报错,而用错了则一定会报错
以上便是if语句的基本内容了
2、switch语句
(1)switch基本语法结构
首先我们看一段代码,以此为例来了解switch的基本语法结构
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
int n = 2;
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("选择错误\n");
break;
}
}
return 0;
}
首先,我们看switch(),switch后面的括号内应当防止一个整型变量(注意:一定要是整型变量),然后根据
变量的值,跳转到对应的case语句处,并执行case控制的语句。我们可以看到,每个case控制的语句之中都有一个break,这个break是非常重要的,它能够造成退出整个循环的效果,如若删除掉这些break,比如这样:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
int n = 2;
switch (day)
{
case 1:
{
printf("星期一\n");
}
case 2:
{
printf("星期二\n");
}
case 3:
{
printf("星期三\n");
}
case 4:
{
printf("星期四\n");
}
case 5:
{
printf("星期五\n");
}
case 6:
{
printf("星期六\n");
}
case 7:
{
printf("星期日\n");
}
default:
{
printf("选择错误\n");
}
return 0;
}
这种情况的话,程序会从对应的case一直执行到末尾,因为没有任何的break能让其跳出。所以当你输入5的时候,会输出
星期五,星期六,星期日和选择错误四段话,所以在使用switch语句的时候如若不是特殊的目的,一定记得加上break。
最后就是default,简单来说就是每个case都不匹配的话,程序就会跳转到default处,执行default控制的语句。
以上便是switch语句的基本用法了。
(2)switch使用时的注意事项
switch的使用的注意事项有三点:break,default还有整型变量。
1、我们先来说简单一点的default,这里只需要阐述一点即可:default可以放在switch结构的任意位置,并且一般的case语句如果不是按序排列如case1,case2其实也是可行的,但是一般都建议按序排列case同时将default至于最后。
2、关于整形变量,其实不一定是int类型,char类型也是可以的,因为字符通过ascii码是可以与整数转换的,可以看做整数的另一种表现形式。但是浮点数比如double和float就不可以了,在使用时编译器会报错。
3、对于break使用时的注意事项我们刚才已经讲了一些了,接下来补充一个点:switch是可以进行嵌套的
#include <stdio.h>
int main() {
int x = 3;
int y = 3;
switch (x % 2)
{
case 1:
switch (y)
{
case 0:
printf("first");
case 1:
printf("second");
break;
default: printf("hello");
}
case 2:
printf("third");
}
return 0;
}
以上代码的输出结果是hellothird,程序运行时先在内部switch的default位置打印hello,紧接着在外部case2中打印third,而break做到的是跳出本层的switch语句,这便是switch特殊的嵌套用法了。
好了,到此我们的分支结构部分便结束了,接下来让我们进入循环的世界!
三、循环
C语言主要有三种循环形,while循环,for循环与do while 循环,其中使用的频率从高到低排列顺序依次是for循环,while循环和do while循环,下面我们将从while入手,详解三中循环。
1、while循环
(1)while循环的基本语法结构
#include<stdio.h>
int main()
{
int num = 0;
if (num == 0)
{
printf("hehe\n");
}
return 0;
}
该段代码输出的结果是呵呵
如果我们将它变换一下
#include<stdio.h>
int main()
{
int num = 0;
while (num == 0)
{
printf("hehe\n");
}
return 0;
}
该程序便会无限输出hehe,我们使用循环也就是为了能输出更多的项,
进行更多的判断以达自己的目的。
while循环的一般形式是这样的
while(判断语句)
{
循环体;
}
当判断语句为真时,会执行下面的循环体,如果判断语句为假时,则会跳出循环。这里要提一点,在循环中,0为假,其他的数为真,而使用的判断语句本质上也是0与1两种值,关系运算符会使为真的判断语句值为1,为假的判断语句值为0。
(2)break和continue在while循环中的应用
先来说说break在while循环中的作用,我们先看下面一段代码
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d", i);
i++;
}
return 0;
}
该段代码的输出结果是12345678910,打印了从1~10的所有整数,如果我们在其中加入break会怎么样呢,
我们们看一看下面的代码
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
break;
}
printf("%d", i);
i++;
}
return 0;
}
这段代码的运行结果变成了1234,输出直接结束了。当我们逐语句调试的时候便会发现,当程序运行到break
处后,下一步直接就退出了这一循环。也就是说,当while循环运行到break处时,会停止一切后续的循环,直
接从该语句跳出循环。
下面我们再看这一段代码
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
continue;
}
printf("%d", i);
i++;
}
return 0;
}
这段代码的输出结果是1234,在输出四之后,程序也并没有停止,而是陷入了死循环也不再打印任何东西
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
{
continue;
}
printf("%d", i);
}
return 0;
}
我们将代码改成这样,便可在每次进行循环时都能够让i的值发生变化,也就不再会陷入死循环了
当然,也有一种特殊的写法可供我们使用
#include<stdio.h>
int main()
{
int i = 0;
while (i++ <= 9)
{
if (5 == i)
{
continue;
}
printf("%d", i);
i++;
}
return 0;
这种写法是将i的调整直接写在判断语句之内,有助于我们降低错误的几率
以上便是break和continue在while循环中的应用了,下面我们再来讲解for循环。
2、for循环
(1)for循环的基本结构
先来看看for循环的基本结构
for(初始化部分;条件判断部分;调整部分)
{
循环语句;
}
可以看到,for循环后面的()内有三种语句
第一种是 初始化部分,用于初始化循环变量
第二种是条件判断部分,用以控制循环的进行与终止
第三种是调整部分,调整循环变量的值
for循环使用起来是比较方便的,比如刚才的打印1~10的程序,我们可以这样写
#include<stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
printf("%d", i);
}
return 0;
}
第一个初始化部分初始化i的值为1,第二个条件判断部分写明了循环进行的条件是i<=10,第三个调整部分
让for循环每次进行的时候i的值都产生+1的变化,最后printf打印每次循环i的值。
(2)break和continue在for循环中的应用
我们看下面的代码,
#include<stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d", i);
}
return 0;
}
程序的输出结果仍然为1234。由此可见,break在for循环与while循环中作用一样。
再看continue在for循环中的应用
#include<stdio.h>
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d", i);
}
return 0;
程序的输出结果是1 2 3 4 6 7 8 9 10,不输出5.这是由于在for循环中,i++并不是位于continue之后程序遇到
continue会跳过后面的printf语句,并且执行i++,所以输出结果只是没有5,这与将i++提至continue之前的while
循环是一样的。
(3)for循环在使用时的注意事项
接下来讲一些使用for循环时的注意事项
1.一定不要在for循环体内进行变量的修改,防止for循环失去控制,而且这也是编译器无法察觉到的错误
2.一般来说,for循环是要有完整的初始化,判断和调整部分的,如果省略了判断部分吗,那么程序会进入无限循环,如果漏写了其他部分,也会出现相应的问题,以此初学者在使用时最好把三个部分都要写全写好。
再来补充一些for循环的用法
1.用字符代替数字计数
#include<stdio.h>
int main()
{
char ch;
for (ch = 'a'; ch < 'z'; ch++)
{
printf("%c", ch);
}
return 0;
}
程序的输出结果是a,b,c...z。该程序能正常运行到原因是字符在内部一整数形式存储,该循环本质上还是用整数来计数
2.其他测试条件
for(num=1;num*num*num<216;num++)
3.让递增的量几何增长
for(i=1;i<10;i*=1.1)
4.嵌套的for循环
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("Wub Lub Dub Dub\n");
}
}
这段代码会执行九次循环,输出九个Wub Lub Dub Dub
5.用多个变量控制循环
for (i = 0, j = 0; i < 2 && j < 5; ++i, j++)
{
printf("wcdc\n");
}
这段代码便会执行两次循环,输出两个wcdc
以上便是for循环的基本内容了。
3、do while循环
(1)do while循环的结构
do
{
循环体;
}while(判断语句);
do while 循环最大的特点就是无论条件是否成立,先执行循环一次,然后再进行判断,如果条件为真,进入循环,如果条件为假,不进入循环,需要注意的是,do while 循环while之后有分号,这也是其特殊的地方。
(2)break和continue在do while循环中的应用
我们来看这样一段代码
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d", i);
if (5 == i)
{
break;
}
i++;
} while (i <= 10);
return 0;
}
这段代码的输出结果是1 2 3 4 5,可见break作用为打破循环,与while中一样
再看下面一段代码
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d", i);
if (5 == i)
{
continue;
}
i++;
} while (i <= 10);
return 0;
}
输出结果为1234555555...4之后无限输出5,也是跳过后面的部分直接进入下一循环,与while中一样。
现在我们已经学习了分支与循环,我们也有很多能做的事情了,可以做一些经典的编程题,也可以根据自己的想法来做一些小程序小游戏,具体的这些我会在下一篇文章里详细介绍。
四、goto语句
C语言提供了可以随意滥用的goto语句和标记跳转的标号。从理论山来说goto语句是没有必要的,实践中没有goto语句也很容易写出代码。但是在某些场合下goto还是用的着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如跳出多层循环,代码如下:
for (...)
for (...)
{
for (...)
{
if (disaster)
goto error;//
}
}
…
error ://注意goto的使用结构
if (disaster)
对于这样的结构,如果用break一步一步跳出循环就很麻烦了,而使用goto就可以达到比较好的效果
这里分别使用goto与if来写两段代码来实现关机程序
#include <stdio.h>
#include<stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");//这里控制程序60s后关机
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");//这里是解除关机程序
}
else
{
goto again;
}
return 0;
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0;
}
以上两段代码作用效果相同,都是先输出程序要关机的指令和解除关机的要求,然后接收到我是猪之后取消关机,
这里就不过多阐述了。
好了,本章到此结束了,正如上述,下一章我们将讲解一些经典的编程题,同时也会介绍一些小游戏,来展示这些语句的用法和有趣的使用。
最后需要提上一嘴,这是我的第一篇技术博客,我知道有很多不足的地方,如果您觉得有什么错误的地方欢迎指正,如果有什么想提的建议我也非常感谢。如果我写的这些东西真的对大家有帮助,那真是再好不过了,感谢看到最后的每一个人!