C语言的分支结构 if语句
前言
程序并不会总是执行同样的处理,例如,按下某个按键的时候执行a处理,按下其他键的时候执行b处理······,程序通过条件判断的结果选择的执行某种处理情况非常多见。
本节介绍的改变程序流程的基本办法
一、if语句
if语句的语法格式
if(表达式)
语句;
但是每个if语句后面只能跟一个语句 ,如果想要跟多个语句就要用大括号括起来,就像这样:
if(表达式)
{
语句;
}
if语句怎么执行:先判断表达式的值,如果结果不为0,则执行相应的语句
int main()
{
int a = 0;
printf("请输入一个数:");
scanf("%d", &a);
if (a % 5) //a不能被5整除是表达为真,表达式执行
{
printf("输入的整数不能被5整除");
}
return ;
}
括号内对条件进行判断的表达式称为控制表达式。上面程序中对控制表达式a % 5的判断结果为a除以5的余数。只有当这个余数不为0,也就是a的值不能被5整除时,才会执行下列语句。
而当我输入的整数能被5整除的时候,后续的语句则不会执行,屏幕上不会显示内容。
看看下面这中if语句
if(表达式) 语句1 else 语句 2
接下来再看一个代码,这个与上面不同的地方在于多了一个else 语句,else语句后面不用加表达式 else是否则的意思。就是表达其对应if语句剩余的情况 ,当表达式的值不为0时执行语句1,当表达时为0执行语句2。
在这里插入代码片
#include<stdio.h>
int main()
{
int a = 0;
printf("请输入一个数:");
scanf("%d", &a);
if (a % 5) //a不能被5整除是表达为真,表达式执行
{
printf("输入的整数不能被5整除");
}
else //其他的情况就是能被5整除的数则为真,表达式执行
{
printf("该整数能被5整除。");
}
return ;
}
这样我们就让代码判断完整了,可以判断是不是5的整数,并将结果输出出来。
接下来让我们写一个代码奇偶数的判断
在这里插入代码片
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2) //如果输入4那4%2的结果就为0,表达式的结果就为假,就执行else下面的语句
{
printf("a为奇数"); //a不能被2整除时执行
}
else
{
printf("a为偶数"); //a能被2整除时执行
}
return 0;
}
1、相等运算符和不相等运算符
== 运算符 ,a == b 如果a和b的值相等,则为1,不相等则为0
!= 运算符 ,a != b 如果a和b的值不相等,则为1,相等则为0
先看一个代码,输入两个整数,判断它们是否相等
在这里插入代码片
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (a == b)
printf("它们相等\n");
else
printf("它们不相等\n");
return 0;
}
== 运算符是对左右两边的操作数进行比较。如果它们两个相等则结果为1。如果不相等则结果为0.
另外 == 和 != 分别是一个运算符。所以如果再= 和= 中间,或者! 和 =中间加上空格,这样是不对的,会改变意思。(不能在中间加空格)
2.关系运算符
这些运算符也是对左右两边的操作数进行比较,也与之前的运算符一样不能在中间加空格
3、嵌套的if语句
判断输入整数的符号
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
printf("为正数");
else
if (a < 0)
{
printf("为负数");
}
else
{
printf("为0");
}
return 0;
}
这个代码中就使用了if语句的嵌套,输入的整数只有3种情况:a>0 ,a<0 , a=0。第一个if语句就判断了a>0的情况,那剩下的else是不是就剩了<0和=0。我们就再在else里面再判断一次if (a < 0),然后就剩下了最后一种a = 0,再用个else就可以了。
上面的代码还可以写成下面这种形式,把
else
{
if
}
写成else if
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
printf("为正数");
else if (a < 0)
printf("为负数");
else
printf("为0");
return 0;
}
接下来再看一个代码
在这里插入代码片
int main()
{
int a = 0;
scanf("%d", &a);
if(a > 0) //大于0执行
if (a % 2 == 0) //当输入12时 12 % 2==0就为真
{
printf("为偶数\n");
}
else //a % 2 != 0就执行
{
printf("为奇数\n");
}
else //小于等于0执行
{
printf("你输入的不是正数\n");
}
return 0;
}
该代码if语句的结构如下
4、条件运算符
条件运算符的结构:a ? b:c 如果a不为0,则结果为b的值,如果a为0,则结果为c的值。
条件运算符属于三目操作符
判断两个整数的中的较大值
在这里插入代码片
int main()
{
int a = 0;
int b = 0;
int max = 0;
scanf("%d%d", &a, &b);
max = (a > b) ? a : b; //a > b 结果为a,a < b,结果为b,最后将得到的值赋给max
printf("最大值为%d\n", max);
return 0;
}
5、逻辑运算符
逻辑运算符:&&并且的意思 ,||或者的意思
在这里插入代码片
int main()
{
int month = 0;
scanf("%d", &month);
if (month >= 3 && month <= 5) //这里运用了&&运算符,要两个条件同事满足才能执行语句
printf("%d是春季节\n", month);
else if (month >= 6 && month <= 8)
printf("%d是夏季\n", month);
else if (month >= 9 && month <= 11)
printf("%d是秋级季\n", month);
else if (month == 1||month == 2 ||month == 12) //这里运用了||运算符,只要其中一个满足就会执行语句
printf("%d是冬季\n", month);
else
printf("月季不存在\n");
return 0;
}
1、逻辑运算符短路
1、if语句首先进行的是判断季节是否为“春季”。 这里假设变量month的值为2,我们来判 断下述表达式。
2、 month >=3 &&month <=5
左操作数month>=3的判断结果为0。这样的话即使不判断右操作数month<=5,整个 表达式的判断结果也显然为0(不是春季)。
也就是说,&&运算符在左操作数的判断结果为0时不对右操作数进行判断。
3、 ||运算符怎样呢?这里我们结合下面这个判断季节是否是“冬季”的表达式来看。 month==1 || month ==2 1 || month ==12 ,如果month为1,则根本不用判断month为2月或12月的情况,整个表达式的判断结果 就为1(是冬季)。
也就是说,||运算符在左操作数的判断结果不为0时不会对右操作数进行判断。
像这样就称为短路求值。
6、if语句使用注意事项
1、空语句
if(表达式);
printf(“…”);
这样的写法是错误的的,我们可以把他理解为这样。
if(表达式)
; //单独一个分号为空语句,如果执行空语句什么都不会发生
printf("........");
2、判断相等
1、== 和=
请注意不要把判断相等性(是否相等)时使用的 == 运算符和 = 混淆
if(a = 0)错误
if(a == 0)对
在错误的例子中,变量a会被赋值为0,这样就不管a的值为什么,该语句都不会执行
2、== 和&&
判断3个变量a b c 的值
if(a == b == c)错误
if(a == b && b == c)对
因为相等运输符== 是双目运算符,所以不能实现第一种错误的语句
3、&&和||
不要使用以bit为单位的逻辑运算符代替逻辑运算符
if(a == b & b == c)错误
if(a == b | b == c)错误
if(a == b || b == c)对
if(a == b && b == c)对