目录
C语言是结构化的程序设计语言
他有顺序结构,选择结构,循环结构三种结构类型
而分支与循环是属于选择结构与循环结构
分支语句:
- if语句
- switch语句
循环语句:
- while语句
- for语句
- do while语句
goto语句
什么是语句?
C语句可分为以下五类:
1. 表达式语句 2. 函数调用语句
3. 控制语句 4. 复合语句
5. 空语句
这里后面介绍的是控制语句
控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成
分支语句(选择结构)
if语句
1.语法形式
//单分支if语句
if(表达式)
语句 1; //若表达式成立,则执行语句 1
else
语句 2; //否则执行语句 2
//多分支if语句
if(表达式 1)
语句 1; //若表达式 1成立,则执行语句 1
else if(表达式 2)
语句 2; //若表达式 2成立,则执行语句 2
...
... //此处省略若干个语句
else
语句 n; //若以上都不满足条件,则执行语句 n
需要注意的是,if判断是根据0/1来判断,1为真,0为假,根据括号内的判断返回值来决定是否执行所属的语句
提示:当存在多条语句时,需要加上{ },否则会报错
if(表达式)
{
语句 1;
语句 2;
...
语句 n;
}
2.悬空else
下面看一条代码:
int main()
{
int a = 0;
int b = 2;
if(a == 1) //第一个if
if(b == 2) //第二个if
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这串代码什么都不输出
由于没有控制代码块的缩进以及使用{ }来控制,此处的else让大部分人在一开始看到时不知道其所对应的if是哪个
但是一般认为,else在没有{ }控制的情况下,会自动与其最靠近的if匹配,也就是与第二个if匹配
所以在日常写代码的时候,排版非常重要,我们需要养成一个好的代码排版习惯
switch语句
1.语法形式
switch(整型表达式) //先判断switch内的是什么表达式
{
case 整形常量表达式: //根据switch内的表达式来跳转到对于的case
语句;
case 整形常量表达式:
语句;
...
...
default: //若没有对于的case,则执行default后的语句
语句;
}
下面是最常见的switch使用例子:
int main()
{
int a = 3;
int b = 1
switch(a - b)
{
case 1:
printf("1");
break;
case 2:
printf("2");
break;
default:
printf("error");
break;
}
return 0;
}
由于a - b 的返回值为2,则switch(a - b) = switch(2),打印2
case决定了语句从哪里进入,break决定了语句从哪里退出
在最后一个 case 语句的后面加上一条 break语句(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)
2.switch语句的另类表达
要求:输入1,2,3,4,5,打印weekday
输入6,7,打印weekend
int main()
{
int day = 0;
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后并非强制要求有语句,从这里也可以了解到,switch语句的执行顺序
3.switch语句的嵌套使用
switch语句也支持嵌套使用
下面是例子:
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\n", m, n);
return 0;
}
执行输出m = 5,n = 3
循环语句(循环结构)
while循环
1.语法形式
while(表达式)
循环语句;
此处的括号也是通过表达式的返回值时0/1来判断是否执行循环语句
2.while循环的break和continue
特别的是,在while循环语句内,break与continue会经常使用,下面来了解一下使用方法
//break 代码实例
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
从上面这个代码可以知道:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环
所以:while中的break是用于永久终止循环的
//continue 代码实例
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
从上面这个代码可以知道:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分,进行下一次循环的入口判断
3.判断输入循环
有时候我们在做题的时候,往往会判断是否有输入元素,若没有输入,则结束执行
我们可以通过while循环来实现此要求
在此之前,需要了解一下scanf函数的返回值
#include <stdio.h>
int main()
{
int ch = 0;
while ((scanf("%d", &ch)) != EOF)
printf("%d\n", ch);
return 0;
}
通过以上代码,就可以实现输入一个数,执行一次while循环体语句,当不输入时,结束程序
for循环
1.语法结构
for(表达式1;表达式2;表达式3)
{
循环语句;
}
在for循环中
表达式1:表达式1为初始化部分,用于初始化循环变量的。
表达式2:表达式2为条件判断部分,用于判断循环时候终止。
表达式3:表达式3为调整部分,用于循环条件的调整。
由于for循环是日后使用次数非常多的一种循环,下面举个例子来加深使用印象
使用for循环 在屏幕上打印1-10的数字
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
循环变量为1,当1小于或等于10时,执行循环体语句
打印变量i的值,然后令i自增1
由于每次循环执行完之后,都会令i自增1,i会一直改变
所以当循环执行10次以后,i在第11次循环执行前为11
11大于10,不满足循环条件,跳出循环
值得一提的是,for循环的表达式1,也就是初始化循环变量,我们还可以这样操作
for(int i = 0; i < n; i++)
2.for循环的break和continue
在for循环中,也可以使用break和continue
//代码1
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
3.for语句的循环控制变量
有时候写代码时可能不小心修改了循环变量,导致循环失控(死循环)
int main()
{
for(int i = 0; i <= 100; i++)
{
...
i = 0; //再循环体内修改了循环变量
}
return 0;
}
所以建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0; //前闭后开的写法 for(i=0; i<10; i++) {} //两边都是闭区间 for(i=0; i<=9; i++) {}
3.for循环的另类写法
int main()
{
for(;;)
{
printf("666\n");
}
for循环的初始化循环变量,判断条件和调整部分是可以 省略的
int i = 0;
int j = 0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("666\n");
}
}
for循环是可以嵌套使用的
int i = 0;
int j = 0;
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("666\n");
}
}
只要在外部事先进行了循环变量的声明与初始化,for循环内的初始化循环变量可以省略
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("666\n");
}
return 0;
}
for循环的控制变量是可以存在多个的
do while循环
1.语法结构
do
循环语句;
while(表达式);
特点:循环至少执行一次
int main()
{
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
2.do while循环的break和continue
int main()
{
int i = 1;
do
{
if(5 == i)
break; //这下面的语句不会执行
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程
例如:一次跳出两层或多层循环,多层循环这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环
使用方法案例:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster) // 处理错误情况
goto跳转到后面跟随的地方,如上例,遇到错误后,跳跃到error处执行if(disaster)这条代码