分支语句
C语言是一种结构化的程序设计语言,结构化意思是指C语言有三种结构,
分别是顺序结构(一条道走下去)、选择结构(去上班可以选择走路,也可以选择开车)、循环结构(循环干一件事)。
选择结构可以使用:if、switch语句实现
循环结构可以使用:for、while、do while语句实现
if语句
语法形式
if(表达式)
语句
表达式如果是真的,执行下面的语句,如果是假的,就不执行语句。
在C语言中,0表示假,非0表示真(注意:负数也表示真)
== 表示等于
举个例子说明一下
输入⼀个整数,判断是否为奇数
#include <stdio.h>
int main()
{
int num = 0;//这里是变量的初始化,应该使用 “=”号
scanf("%d",&num);
if(num % 2 == 1)//if语句后面不能有;(如果有他会执行空语句,不管条件是否成立,都会执行后面的语句)
printf("%d 是 奇数\n", num);//后面要加\n,表示换行
return 0;
}
else
一个整数不是奇数就是偶数,所以引出了else
语法形式:
if(表达式)
语句1
else
语句2
例⼦:输入⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数
#include <stdio.h>
int main()
{
int num = 0 ;
scanf("%d",&num);
if(num %2 == 1)
printf("%d 是 奇数",num);
else
printf("%d 是 偶数", num);
return 0;
}
练习:输⼊⼀个年龄,>=18岁就输出:成年,否则就输出:未成年
#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");
printf("可以谈恋爱了\n");//这里if想要控制两条语句,需要加上{},而{}也叫代码块,或者叫复合语句
}
else
{
printf("未成年\n");
printf("禁止谈恋爱\n");//这里else想要控制两条语句,需要加上{},而{}也叫代码块,或者叫复合语句
}
return 0;
}
if嵌套
在if else语句中嵌套else,构成多重判断
例如:输入一个整数,判断它是正数,负数,还是0
#include <stdio.h>
int main()
{
int num = 0;
//输入
scanf("%d", &num);
//输出
if (num == 0)
printf("输入的值是0\n");
else
{
if (num > 0)
printf("输入的值是正数\n");
else
printf("输入的值是负数\n");
}
return 0;
}
//正常逻辑是这样的,但为了代码的简洁和美观,会将else中的{}删除,具体内容请看如下代码
#include <stdio.h>
int main()
{
int num = 0;
//输入
scanf("%d", &num);
//输出
if (num == 0)
printf("输入的值是0\n");
else if (num > 0)//这里就是简洁后的代码,值得注意的是这里的if嵌套在else语句中
printf("输入的值是正数\n");
else
printf("输入的值是负数\n");
return 0;
}
换种思路来解答上述问题:
能不能在if语句里嵌套呢?当然是可以的了,代码如下
#include <stdio.h>
int main()
{
int num = 0 ;
scanf("%d",&num);
if(num <= 0)//这里的if嵌套在if语句中
{
if(num == 0)
printf("输入的值是0\n");
else
printf("输入的值是负数\n");
}
else
printf("输入的值是正数\n");
return 0;
}
做个小练习:
输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数。
#include <stdio.h>
int main()
{
int num = 0 ;
scanf("%d", &num);
//输入
if( num > 0)
{
if( num % 2 == 1)
printf("%d 是 奇数\n", num);
else
printf("%d 是 偶数\n", num);
}
else
//printf("%d 是 非正数");//注意这里也要写上num和/n
printf("%d 是 非正数/n", num);
//判断
return 0;
}//总结:注意代码的缩进以及什么时候敲空格
另一种写法:
#include <stdio.h>
int main()
{
int num = 0;
//scanf("%d" , &num);//这里要记得敲空格
scanf ("%d" , &num);
if(num <= 0)
printf("%d 为非正数\n", num);
else if(num % 2 == 1)
printf("%d 是奇数\n" , num);
else
printf("%d 是偶数\n" , num);
return 0;
}
练习:
输⼊⼀个人的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁至44岁打印"青年"
如果年龄在45岁至59岁打印"中老年"
如果年龄在60岁至89岁打印"老年"
如果90岁及以上打印"老寿星"
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);//这里是在if里嵌套if else语句
if (age >= 18)
{
if (age < 45)
printf("青年\n");
else
{
if (age < 60)
printf("中老年\n");
else
{
if (age < 90)
printf("老年\n");
else
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 < 45)//这是嵌套在else里的
printf("青年\n");
else if (age < 60)
printf("中老年\n");
else if (age < 90)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
总结:不管是在if还是在else里嵌套,嵌套的部分中都要包含其整体,不能缺少
if(表达式)
语句1
else
语句2
嵌套有种 并且(&&) 的味道
else悬空问题
如果有多条if else语句,else 只会与最近的if语句匹配
举个简单的例子:
上面啥也没有输出,原因是else只会与if (b == 2)匹配,而第一个if语句不成立,后面的嵌套也不会执行,另外它没有和它匹配的else的语句,因此啥也不会执行
关系操作符
C语言中用于比较的表达式叫做“关系表达式”,里面的运算符叫做“关系运算符”
主要有六种:
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 相等运算符
!= 不相等运算符
表达式返回为1或0,表示真或假
值得注意的是:= 是搞赋值的,而 == 表示相等的意思,不要搞混了
举个简单的例子
这是 ==(相等)的表达式,只有相等才会打印 hello world,我们再来看 =(赋值)的代码执行结果
即使不相等也会打印,这就是两者的区别
我们在写一个变量和一个常量相等的时候应该怎么写呢?
建议将常量放在 == 左边 图片如下
方便我们检验 = 和 ==
还有一个需要避免的错误是:多个关系操作符不适合连用
i < j < k
虽然这种表达式合法,但是由于在C语言中关系运算符是从左往右开始计算的,因此会出现以下情况:
(i < j ) < k
由于i < j 返回的值是0或1,最终与 k 比较的是0 或 1,如果想要比较 j 是否在 i 到 k 之间,则需要以下表达式:
i < j && j < k
“&&” 这个符号表示并且的意思
举个简单的例子:
我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。
#include <stdio.h>
int main ()
{
int age = 0;
scanf("%d", &age);
if(18 <= age <= 36)//错误的写法
printf("青年\n");
return 0;
}
由代码的运行结果看出,即使是不在18~36岁也会打印青年
下面请看正确的代码及运行结果:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(18 <= age && age <= 36)//正确的写法
printf("青年\n");
return 0;
}
因此多个运算符不宜连用
条件操作符
也叫三目操作符,他的表达式如下:
exp1 ? exp2 : exp3
它的计算逻辑是:如果exp1为真,计算exp2,且exp2是整个表达式的结果;如果exp1为假,计算exp3,且exp3是整个表达式的结果.
练习1:使用条件操作符表示下面代码的逻辑
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
//改造后的代码如下:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d" , &a);
b = (a > 5 ? 3 : -3);
printf("%d\n" , b);
return 0;
}
练习2:使⽤条件表达式实现找两个数中较大值。
#include <stdio.h>
int main ()
{
int a = 0;
int b = 0;
//scanf("%d" "%d" , &a , &b);//注意这里只需要一个""
scanf("%d %d" , &a , &b);
//m = (a>b ? a : b);//m从何而来,需要前面加个int
int m = (a>b ? a : b);
printf("%d\n", m);
return 0;
}
逻辑运算符 ! && ||
! 逻辑取反运算符(改变单个表达式的真假)
&& 逻辑与运算符(两侧的表达式为真,则为真,否则为假)
|| 逻辑或运算符(两侧的表达式有一个为真,则为真,否则为假)
! 逻辑取反运算符
如图所示:
举个小例子:
我们有⼀个变量叫 num ,如果num为假,要做⼀个什么事情
#include <stdio.h>
int main()
{
int num = 1;
scanf("%d" , &num);
if(!num)
printf("hello bit \n");
return 0;
}
这里的num == 0表示为假,但由于 ! 的作用下使它变得为真,代码因此而运行
这里的num == 9表示为真,由于 ! 存在,使得if语句表示为假,所以才不会打印
&&逻辑与运算符
与表示并且的意思,只有当a和b都为真的时候,表达式则为真,否则为假,其中&&为双目操作符
举个例子:
如果我们说⽉份是3⽉到5⽉,是春天,那使⽤代码怎么体现呢?
#include <stdio.h>
int main()
{
int month = 1;
scanf("%d", &month);
if(month >= 3 && month <= 5 )
printf("春季\n");
return 0;
}
代码运行结果如下:
|| 逻辑或运算符
表示或者的意思,当a或者b中有一个为真,表达式就为真,如果a和b都为假,则表达式为假,其中 || 为双目操作符
同样举个例子:
我们说⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
#include <stdio.h>
int main()
{
int month = 1;
scanf("%d" , &month);
if(month == 1 || month == 2 || month == 12)
printf("冬季\n");
return 0;
}
练习:闰年的判断
闰年判断的规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d ", &year);
if((year % 4 == 0 && year % 100!= 0 ) || (year % 400 == 0))//不等于的符号为 !=
printf("%d 是闰年\n", year);
return 0;
}
短路
C语言的逻辑运算符有个特点:逻辑运算符是从左往右对表达式进行求值如果左边的表达式满足逻辑运算符的条件,就不会对右边的表达式进行求值,这种情况叫做“短路”
在 || 中,一真则真
在 && 中,一假则假
switch语句
它是 if...else的一种特殊的分支语句,适用于含有多个结果的情况
语法形式:
switch (expression)
{
case value1:
statement
case value 2:
statement
default:
statement}
上面的switch语句的表达式中的值对应为几,就执行对应几的分支,如果没有对应的值,那么执行default这个分支
注意:
switch后的expression必须是整型表达式
case后面的必须是整型常量表达式
字符类型是也是归类到整型家族的因为字符的本质ASCII码值
举个小案例:
输入字符:A B C 打印其对应的十进制数字(分别是 65 66 67)
#include<stdio.h>
int main()
{
char arr = 0;
scanf("%c", &arr);
switch (arr)
{
case 'A':
printf("%c 的十进制数字是 65\n", arr);
break;
case'B':
printf("%c 的十进制数字是 66\n", arr);
break;
case'C':
printf("%c 的十进制数字是67\n", arr);
break;
}
return 0;
}
举个例子
练习:输⼊任意⼀个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
switch(num % 3)
{
case 0:
printf("%d 的余数为0", num);
break;
case 1:
printf("%d 的余数为1", num);
break;
case 2:
printf("%d 的余数为2", num);
break;
}
return 0;
}
这里需要注意的点是:
case 与后面的数字要有空格
每一个 case代码执行完成后,需要加上break才可以跳出switch
关于switch语句中的break
如果我们在每个case 的后面不加上break会发生什么情况呢
代码如下:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch(num % 3)
{
case 0:
printf("%d\n", num);
case 1:
printf("%d\n", num);
case 2:
printf("%d\n",num);
}
return 0;
}
结果如下:
代码执行后,99的余数是0,但是它不会跳出循环,继续往下打印,可见每个case后面加上break的重要性,当然也不是每个case后面都要加上break,具体情况具体分析
再来个练习:
输⼊⼀个1~7的数字,打印对应的星期⼏
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch (num)
{
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;
}
如果需求发⽣变化,变为:
- 输⼊1~5,输出的是“工作日”;
- 输⼊6~7,输出“休息日”
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
}
return 0;
}
switch语句中的default
有时switch后的整型表达式与所有case的值无法匹配,这时就需要default与登场了
假设前面的例子中输入的不是1~7的数字,就得需要用户请重新输入
代码如下:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch (num)
{
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语句中default和case的顺序没有要求,但一般情况下是将default放在最后的