1.if 语句
1.1if
if后可加 表达式 和 语句
if (表达式)
语句;
若表达式为真(非0)则继续运行,若假(0)则不执行;
1.2else
if...else... 语句来进行不同情况的运算。
例:判断整数的奇偶
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("奇数\n");
else
printf("偶数\n");
return 0;
}
运行方式:打入数字,若/2(% 2 )余数为1(为非0,真),打印 奇数,否则(else)(为0,假)打印 偶数
1.3分支中包含多条语句
if语句默认只能控制一条语句
#include <stdio.h>
int main()
{
int tem = 0;
scanf("%d", &tem);
if(tem >= 30)
printf("热了\n");
printf("可以穿短裤\n");
return 0;
}
我们发现不论多少度都“可以穿短裤了”,显然if没有控制住第二条语句,这时我们需要用大括号 ({ })来限制住
#include <stdio.h>
int main()
{
int tem = 0;
scanf("%d", &tem);
if (tem >= 30)
{
printf("热了\n");
printf("可以穿短裤了\n");
}
return 0;
}
结合else可简单组成
#include <stdio.h>
int main()
{
int tem = 0;
scanf("%d", &tem);
if (tem >= 30)
{
printf("热了\n");
printf("可以穿短裤了\n");
}
else
{
printf("不热\n");
}
return 0;
}
如此看就正常了。
1.4嵌套if
if...else... 句式中,我们可以把else与if连用
例:判断输入整数的正负
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else
{
if (num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
}
return 0;
}
当然, if 的嵌套可以在代码中多次合理利用,而其中else条件下{ }可以省略。
例:通过输入的年龄来判断此人的人生阶段(这里省略{ })
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else if (age <= 44)
printf("青年\n");
else if (age <= 59)
printf("中老年\n");
else if (age <= 90)
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 <= 44)
{
printf("青年\n");
}
else
{
if (age <= 59)
{
printf("中老年\n");
}
else
{
if (age <= 90)
printf("老年\n");
else
printf("老寿星\n");
}
}
}
return 0;
}
1.5悬空else问题
else的归属问题,切记,else 永远跟最近的 if 匹配。
看下面代码
#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与 b==2 的 if 匹配,尽管代码中 else 与第一个 if 对齐,但完全与其没有关系,至于为什么啥也没有,是因为第一个 if 就已经 假 了,第二个就不会执行了。
更直观点,可以如此看
当然,如果想让 else 与第一个 if 有关,可以下改变
#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;
}
当 a==1 为假时, hehe 不执行,执行 else , haha
2.switch 语句
2.1 switch 与 if
除 if 语句,c 语言还有 switch 语句实现分支。
一般用 switch ... case ... default ,case,default表分支,如找不到case分支的值,执行default分支。
例:输⼊任意⼀个整数值,计算除3之后的余数
if 语句
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
switch 语句
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
*注意 break ,只有break才能让switch跳出循环。
2.2 switch语句中的break
每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
当2.1中代码失去 break 后
理论上,出现 整除,余数为0 就应当停止,但却出现了下面所有结果。
原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏到了 case 2 中的语句,经循环到switch才停止。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
例:1-7对应 星期*
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
例:根据星期*来断定工作日或休息日
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d ", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
2.3switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊ default 分支。
就用2.3中第一个代码举例:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
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 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期⼀\n");
break;
case 2:
printf("星期⼆\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
default:
printf("输入错误\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
3.while 循环
3.1 if 和 while
while 语句的语法结构和 if 语句⾮常相似。
while(表达式)
语句;
#include <stdio.h>
int main()
{
if(1)
printf("hehe\n"); //if后边条件满⾜,打印⼀次hehe
return 0;
}
#include <stdio.h>
int main()
{
while(1)
printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
return 0;
}
3.2循环实例
在屏幕上打印 1~10 的值
#include <stdio.h>
int main() //while循环
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
4.for 循环
4.1语法形式
for(表达式1; 表达式2; 表达式3)
语句;
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
*注意三者顺序
for(;;)
初始化部分,调整部分,判断部分 都可以省掉
但是判断部分如果省略不写,就意味着判断条件恒为真,就死循环
4.2for循环实例
在屏幕上打印 1~10 的值
#include <stdio.h>
int main()//for循环
{
int i = 1;
for (i = 1; i <= 10; i++)
printf("%d ", i);
return 0;
}
4.3while循环和for循环的对比
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分⾮常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优⼀些。
5 do while循环
5.1语法形式
do
语句;
while(表达式);
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环;⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
5.2do while循环实例
在屏幕上打印 1~10 的值
#include <stdio.h>
int main()// do while循环
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}