😍😍😍大家好,我是十月天香,希望你看完后能有所帮助,如果有错误请指出来,共同进步!
本文由十月天香原创,如有转载请告知。
😉😉😉个人主页:十月天香——>CSDN博客。🎁🎁🎁
💯💯💯系列专栏:初识C语言。🎉🎉🎉
💖💖💖欢迎各位:点赞+关注+收藏+留言。🥳🥳🥳
目录
前言
想在学校C语言实操课上和法摸鱼吗?想C语言课上玩游戏被老师表扬吗?,那么现在我们将走进分支和循环,你是否准备好呢?上吧,学好他们在课上写个小游戏摸鱼吧!
——————————————————————————————————————————
if语句
if语句语法如下:
if(表达式)
语句;
表达式成立(为真),则语句执行;表达式(为假),则语句不执行。
C语言中,0为假,非0为真,也是表达式结果为0,语句不执行;结果为非0,语句执行。
下面我们看一个例题: 输入一个整数,判断是否为奇数?
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a % 2 == 1)
printf("%d是奇数\n",a);
return 0;
}
else
if....else...语句语法如下:
if(表达式)
语句1
else
语句2
输入一个整数,判断是否为奇数,是打印奇数,否则打印偶数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num % 2 == 1)
printf("%d是奇数\n",num);
else
printf("%d是偶数\n",num);
return 0;
}
通过上面的运行结果我们可以看出,当输入数据满足表达式num%2==1时,就走if语句,打印奇数;表达式不满足num%2==1,就走else语句,打印偶数。
所以表达式为真,执行if语句,表达式为假,执行else语句。
我们再练习一个题目:输入一个年龄,>=18输出:成年,否则输出:未成年。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
分支中包含多条语句
在编译器默认的情况下,if和else语句中都只控制一条语句,看代码:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a>=18)
printf("成年了\n");
printf("可以谈恋爱\n");
return 0;
}
你发现无论输入值是>=18 ,还是<18,“可以谈恋爱”都会被打印在屏幕上。
是因为if语句只能控制printf("成年了\n");,if语句位真,打印、为假,不打印。对于printf("可以谈恋爱了");是独立存在的,不管if语句真假,都会被执行,想同时控制多条语句,可以用大括号{ }将代码括起来。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a>=18)//if使用{}控制多条语句叫语句块,复合语句
{
printf("成年了\n");
printf("可以谈恋爱\n");
}
return 0;
}
else语句也可以用{ }括起来:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a>=18)//if使用{}控制多条语句叫语句块,复合语句
{
printf("成年了\n");
printf("可以谈恋爱\n");
}
elae
{
printf("未成年\n");
printf("不可以恋爱\n");
}
return 0;
}
嵌套if
在if...else...语句中,else可以于另一个if语句连用,构成多重判断。
比如:输入一个整数,判断输入是0,正数,负数。代码如下:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a == 0)
printf("输入0\n");
else if(a > 0)
printf("正数\n");
else
printf("负数\n");
return 0;
}
下面红框里的代码就是嵌套在前面else语句中的,构成嵌套if语句。
在来一个例子:输入一个整数,如果整数>0,再判断奇偶并输出,否则输出负数。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a > 0)
{
if(a % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("负数\n");
}
return 0;
}
来一个题目练练手:输入一个年龄,如果<18打印少年、18-44打印青年、45-59打印中老年、60-89打印老年、90以上打印老寿星。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a<18)
printf("少年\n");
else if(a<=44)
printf("青年\n");
else if(a<=59)
printf("中老年\n");
else if(a<=90)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
还可以在此基础上进行改变,使其变得更加容易阅读:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a<18)
{
printf("少年\n");
}
else
{
if(a<=44)
{
printf("青年\n");
}
else
{
if(a<=59)
{
printf("中老年\n");
}
else
{
if(a<=90)
printf("老年\n");
else
printf("老寿星\n");
}
}
}
return 0;
}
悬空else问题
如果有多个if和else,可要记住:else总是跟最近的if匹配。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
else
printf("haha\n");
return 0;
}
以上代码,输出结果:啥都不输出。
虽然代码排版让else和第一个if语句对齐,让我们以为else和第一个if匹配,但实际上else和第二个if语句匹配,这也就是说,if...else...语句嵌套在第一个if语句中,第一个if语句不执行,后面的嵌套if...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;
}
或者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;
}
关系操作符
C语言中用来比较的表达式,叫关系表达式,里面用到的运算符是关系运算符。常见的关系运算符如下:
> //大于运算符
< //小于运算符
>= //大于等于运算符
<= //小于等于运算符
== //等于运算符
!= //不等于运算符
关系表达式通常返回0或1,表示真假。C语言中,0表示假,非0表示真。比如20>11返回1、11>20返回0。关系表达式通常用于if语句或while语句。
注意:
等于运算符==和赋值运算符=是两个不一样的运算符,有时写错,可以运行,但结果出人意料,为防止出现这种错误,可以将变量写在==右边。
if(3==a)
这样将==写成=编译器就会报错。
注意:
多个关系符不易连用。
a < b < c
这个看着合法,不会报错,但通常达不到想要的效果。因为关系运算符从左向右计算,实际执行的是:
(a < b) < c
a<b先返回0或1,0或1再与c比较,如果想判断b在a、c之间的大小,可以写成:
a < b && b < c
比如:输入年龄,在18-36之间,打印青年
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(18 <= a <= 36)
{
printf("青年\n");
}
return 0;
}
当我们输入10时,会打印青年,因为我们先表达式18<=10为假,返回0,再0<=36为真,所以打印青年,逻辑上有问题,应该改成:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(18 <= a && a <= 36)
{
printf("青年\n");
}
return 0;
}
逻辑操作符:&&、||、!
逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有:
&&:与运算符,就是并且的意思(两侧表达式为真,则为真,否则为假)。
||:或运算符,就是或者的意思(两测至少一个为真,否则为假)。
!:逻辑取反运算符(改变单个表达式真假)。
逻辑取反符
比如,有一个变量a,如果a为假,要执行语句,可以这样写代码:
int main()
{
int a = 0;
if (!a)
{
printf("do something\n");
}
return 0;
}
如果a为真,!a为假;a为假,!a为真,所以上面是a为假,执行if语句。
与运算符
&&是一个双目操作符,使用方法:a&&b,&&两边为真,表达式才为真。
比如,3月到5月是春天,代码如下:
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 3 && a <= 5)
{
printf("春天\n");
}
return 0;
}
或运算符
||是一个双目操作符,使用方法:a||b,||两边至少一个为真,才为真。
比如,一年12月或1月或2月是冬天,代码如下:
int main()
{
int a = 0;
scanf("%d", &a);
if(a==12||a==1||a==2)
{
printf("冬天\n");
}
return 0;
}
练习
输入一个年份,判断是否为闰年。
规则:1,能被4整除,且不被100整除
2,能被400整除
//代码1
int main()
{
int a = 0;
scanf("%d", &a);
if(a % 4 == 0 && a % 100 != 0)
{
printf("闰年\n");
}
else if(a % 400 == 0)
{
printf("闰年\n");
}
return 0;
}
//代码2
int main()
{
int a = 0;
scanf("%d", &a);
if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
{
printf("闰年\n");
}
return 0;
}
短路
C语言逻辑运算符总是左侧的表达式求值,再对右侧的表达式求值,顺序保证,如果左侧表达式满足条件,就不对右侧求值,这种叫短路 。
if(a >= 3 && a <= 5 )
表达式中当a>=3为0时,即使不判断a<=5,表达式结果也为1。
if(a == 3 || a == 6|| a == 12)
如果a==3,则不再判断后面,这个表达式结果为1。
向上面仅知道左边结果就可以判断这个表达式的结果,是短路运算。
switch语句
switch语句是一种特殊形式的if...else...结构,用于判断条件有多个结果,把多重else...if...更改成可读性更好、更易用的形式。
switch(expression)
{
case value1:
statement
case value2:
statement
default:
statement
}
根据espression不同值,执行相应的case分支,如果没有对应值,就执行default。
注意:
switch后面,必须为整型表达式。
case后面,必须为整型常量表达式。
if语句和switch语句对比
输入一个值,除3之后的余数:
用if语句:
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 3 == 1)
printf("整除,余数0\n");
else if(a%3==1)
printf("余数1\n");
else if (a % 3 == 2)
printf("余数2\n");
return 0;
}
用switch语句:
int main()
{
int a = 0;
scanf("%d", &a);
switch (a % 3)
{
case 0:
printf("整除,余数0\n");
break;
case 1:
printf("余数1\n");
break;
case 2:
printf("余数2\n");
break;
}
return 0;
}
注意:
case和后面数字之间必须有空格。
每一个case语句执行完成后,要加上break,才能跳出switch语句。
switch语句中的break
int main()
{
int a = 0;
scanf("%d", &a);
switch (a % 3)
{
case 0:
printf("整除,余数0\n");
case 1:
printf("余数1\n");
case 2:
printf("余数2\n");
}
return 0;
}
上面的代码是将break去掉了,运行结果:
7除以3本来余数是1,但是结果 却多打印一行“余数2”,是因为switch语句有分支效果,只有switch语句中使用break才能跳出switch语句,如果某个case语句后面没有break语句,代码将继续向下执行,可能执行其他case语句中的代码,直到遇到break或switch语句结束。
switch语句中break语句非常重要,能实现真正分支效果,但不是每个case语句都要有break,看实际情况。
练习1:
输入1-7的数字,打印对应周几。如输入:1,输出:周一。
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
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;
}
练习2:
输入1-5,输出:工作日、输入6-7,输出:周末
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末\n");
break;
}
return 0;
}
switch语句中的default
使用switch语句时,如switch后面表达式的值无法与case匹配,要不就不做处理,要不就加default语句。
switch(expression)
{
case value1:
statement
case value2:
statement
default:
statement
}
espression既不是value1也不是value2时,会执行default语句。
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
switch语句case和default顺序问题
没有强制的顺序要求,只要满足自己需求就可以了,通常我们把default放在最后面。(完)