目录
分支语句(选择结构)
1、if语句
if语句的语法(三种正确用法)
语法结构:
//第一种用法
if(表达式)
语句;
//第二种用法
if(表达式)
语句1;
else
语句2;
//多分支(第三种用法)
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
补充:
什么是语句:c语言中用分号(;)隔开的就是一条语句。
if后面只能跟着一个语句,如果跟着多个语句就要用到代码块( { } ),但是有时候为了简洁明了就算有一个语句也加上代码块。
第一种用法:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num <= 18) //判断:如果为真就进入执行代码块的内容,为假就代码块的内容就不执行
{
printf("未成年");
}
return 0;
}
第二种用法
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num <= 18) //判断:条件为真执行if语句后面代码块的内容(不执行else后面的内容)
{ //条件为假执行else语句后面代码块的内容(不执行if后面的内容)
printf("未成年");
}
else
{
printf("成年");
}
return 0;
}
第三种用法
int main()
{
int num = 0;
scanf("%d", &num);
if (num <= 18)
printf("未成年\n");
else if (num > 18 && num <= 30)
printf("青年\n");
else if (num > 30 && num <= 50)
printf("壮年\n");
else if (num > 50 && num <= 70)
printf("中老年\n");
else if (num > 70 && num <= 100)
printf("老年\n");
else
printf("老不死的\n");
return 0;
}
//其中判断:只要其中的一项符合条件,代码就跳出去。
2、if语句 - 常见问题代码
第一种:效率降低
int main()
{
int num = 0;
scanf("%d", &num);
if (num <= 18)
printf("未成年\n");
if (num > 18 && num <= 30)
printf("青年\n");
if (num > 30 && num <= 50)
printf("壮年\n");
if (num > 50 && num <= 70)
printf("中老年\n");
if (num > 70 && num <= 100)
printf("老年\n");
if(num >100)
printf("老不死的\n");
return 0;
}
这个代码也是能跑起来的但是效率没有上面 if - else if - else 的效率高
上面的 if - else if - else 只要判断一个条件成立就跳出去。
而这个代码每一个都要判断。
第二种
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num <= 18)
printf("未成年");
else //下面这条语句要用到代码块
printf("成年");
printf("可以谈恋爱");
return 0;
}
这个语句是错误的:if和else后面只能跟着一条语句,跟多条语句要用到代码块
第三种
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (10 < num <= 18) //输入数字为30 —— 30大于10 —— 为真 —— 真为1 —— 1小于18 —— 真(执行)
printf("未成年");//输入数字为5 —— 5小于10 —— 为假 —— 假为0 —— 0小于18 —— 真(执行)
else
printf("成年");
return 0;
}
这个代码无论你输入什么样的数字都会打印未成年。
第四种:这个代码的风格有一点问题(容易产生歧义)
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else //else和离他最近的if相匹配。
printf("haha\n");
return 0;
}
这个代码如果不想产生歧义可以这样写
#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;
}
3、if语句练习
(1)判断一个数是否为奇数
(2)输出1 —— 100之间的奇数
下面是两个练习的代码:
//判断一个数是否为奇数
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 1)
{
printf("奇数\n");
}
else
{
printf("偶数\n");
}
return 0;
}
//输出1 — 100之间的奇数
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
4、switch语句
Switch语句也是一种语句,长长用于多分支的情况。
比如:输入一个数字,然后打印星期几(输入1,输出星期一......)
如果要写成 if...else if ...else if 的形式,太复杂了,这时就可以用switch 语句。
switch(整型表达式) //这里面的整型表达式只能放整数,不能放浮点数
{
case(整型常量表达式):
语句;
}
其中switch语句中可以包含多个case语句
switch中break的应用
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1: //从case(整型常量表达式)进入
printf("星期一\n");
break; //遇见break从switch中出来 —— 如果没有遇见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;
}
需求更改:
1. 输入1-5输出的是“weekday”
2. 输入6-7输出“weekend”
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
break语句的实际效果是把语句列表划分为不同的部分。
switch 中的 default 子句
(1)如果表达的值与所有的case标签的值都不匹配,程序并不会终止,也不会报错,因为这种情况在C中并不认为适合错误。
(2)你可以在语句列表中增加一条default子句,当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。
(3)每个switch语句中只能出现一条default子句。
(4)它可以出现在语句列表的任何位置。
一道练习题
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n) //switch允许嵌套使用
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default: //如果n != 1 2 3 4,则执行这条语句
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
//最终打印的值为m = 5, n = 3。
分析:
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n) //n = 1 —— 进入 case 1:
{
case 1:
m++; //m = 3
case 2:
n++; //n = 2
case 3:
switch (n) //n = 2 —— 进入 case 2:
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++; //m = 4
n++; //n = 3
break; //跳出case 3:中的 switch 语句 —— 进入case 4:
}
case 4:
m++; //m = 5
break; //跳出 switch 语句
default:
break;
}
printf("m = %d, n = %d\n", m, n); //m = 5, n = 3
return 0;
}
循环语句
1、while循环
有时候我们遇到有一个事情要我们反复的去做。
C语言中给我们引入了:while语句,可以实现循环。
while(表达式)
循环语句;
举例:在电脑上打印1到10的数字。
#include<stdio.h>
int main()
{
int i = 0;
i = 1;
while (i <= 10)
{
printf("%d ", i); //打印值为1 2 3 4 5 6 7 8 9 10
i++;
}
return 0;
}
while语句中的break
break在while循环中的作用:
循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
while中的break是终止所有循环,直接跳出循环。
举例:
#include<stdio.h>
int main()
{
int i = 0;
i = 1;
while (i <= 10)
{
if (i == 5) //当i = 5是执行break语句,直接终止后面的所有循环
break;
printf("%d ", i);//最终屏幕上打印值是1 2 3 4
i++;
}
return 0;
}
while语句中的continue
continue在while循环中的作用:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
举例:
#include<stdio.h>
int main()
{
int i = 0;
i = 1;
while (i <= 10)
{
if (i == 5)//当i = 5时,执行continue语句, 不执行i++语句——所以之后i的值一直是5(死循环)
continue;
printf("%d ", i);//打印值为1 2 3 4 然后死循环
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 0;
i = 1;
while (i <= 10)
{
i++;
if (i == 5) //当i = 5时执行continue语句
continue;
printf("%d ", i); //打印值为2 3 4 6 7 8 9 10 11,中间没有打印5
}
return 0;
}
2、for循环
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量的。
表达式2 表达式2为条件判断部分,用于判断循环时候终止。
表达式3 表达式3为调整部分,用于循环条件的调整。
for循环和while循环:实现打印1到10的数字。
#include<stdio.h>
int main()
{
int i = 0;
i = 1; //初始化部分
while (i <= 10) //条件判断
{
printf("%d ", i);
i++; //调整
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++) //初始化部分 条件判断 调整
{
printf("%d ", i);
}
return 0;
}
可以发现在while循环中依然存在循环的三个必须条件
但是由于风格的问题使得三个部分很可能偏离 较远,这样查找修改就不够集中和方便。
所以,for循环的风格更胜一筹。
for循环使用的频率也高。
break和continue在for循环中
举例:
//for循环 —— break
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i); //打印值为1 2 3 4
}
return 0;
}
//for循环 —— continue
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue; //当i == 5时,执行continue,直接跳到 —— (调整部分)i++(i的值能改变)
printf("%d ",i); //打印值为1 2 3 4 6 7 8 9 10
}
return 0;
}
一些建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。(可以仔细感受下面两种写法)
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{
}
//两边都是闭区间
for(i=0; i<=9; i++)
{
}
for循环的变种
变种1
#include <stdio.h>
int main()
{
for(;;)
{
printf("hehe\n");
}
return 0;
}
上面这个代码死循环:
分析:初始化、条件判断、调整部分都是可以省略的,但是条件判断省略表示条件判断一直为真。所以上面这个代码的死循环
建议:尽量不要省略 初始化、条件判断、调整部分 因为有可能会出现意想不到的结果
举例:
//不省略
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("haha\n"); //打印100个haha。
}
}
return 0;
}
//省略
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 10; i++)
{
//分析:当i = 0时 —— j从0变到10 —— 10不满足条件就会退出第二层循环
//当执行i++,i = 1时 —— j这时还是10(没有初始化成0)进入第二层 —— 不满足条件退出第二次循环
//同理:i = 3时,也一样 —————— 最后打印10个haha
for (; j < 10; j++)
{
printf("haha\n"); //打印10个haha。
}
}
return 0;
}
变种2
#include <stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n"); //打印两个hehe
}
return 0;
}
一道笔试题:
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
答案 :0次
分析:这里要注意 k = 0 和 k == 0 的区别,k = 0 表示把0赋值给k 0表示假 不执行, k == 0 表示如果 k的值等于 0 —— 语句执行,否则不执行。
3、do...while ( ) 循环
do
循环语句;
while(表达式);
do...while ( ) 循环最少执行一次程序。使用的场景有限,所以不是经常使用。
do while循环中的break和continue
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i); //打印值为1 2 3 4
if(5 == i)
break;
i++;
} while (i <= 10);
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i); //打印值为1 2 3 4 + 5的死循环
if(5 == i)
continue;
i++;
} while (i <= 10);
return 0;
}
4、goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程,例如一次跳出两层或多层循环。
这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
下面是使用goto语句的一个例子:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error: //利用goto跳出多层循环
if(disaster)