目录
分支语句if
分支语句if需要注意的重要事项
表达式的值
1.判断表达式的值
2.赋值表达式的值
3.复合表达式的值
if的嵌套使用
C语言是一种结构化的程序设计语言,C语言的结构有三种,顺序结构,选择结构和循环结构,结构是由语句构成的,一个分号隔开的就是一个语句,现在讲一下分支语句。
分支语句if
分支语句if有两种主要的形式
//格式一
if(表达式)
语句1;
else
语句2;
//当表达式为真时执行语句1,为假时执行语句2
//格式二
if(表达式1)
语句1;
else if(表达式2)//else if可以有很多个,
但是每个if,else if,else语句是并列的,
并且执行的语句只有其中一个分支语句对应的语句或者语句块
语句2;
else
语句3;
//当表达式1为真时执行语句1,
表达式1为假且表达式2为真时执行语句2,
表达式1和表达式2都为假时执行语句3
接下来再看两个代码
int main() { //代码1
int a = 99;
if (a >= 60)
printf("及格");
else if (a >= 90)
printf("优秀");
else
printf("不及格");
}
int main() { //代码2
int a = 99;
if (a >= 90)
printf("优秀");
else if (a >= 60)
printf("及格");
else
printf("不及格");
}
代码1的结果是优秀,而代码2的结果是及格,相信大家读懂了这两个简单的程序就不难理解分支语句是一个并列的结构并且一个分支语句结构只能执行其中一个语句或者是语句块。
分支语句if需要注意的重要事项
有if可以没有else和else if但是有else if和else时必须与一个没有配对的if进行配对,这里面有一个非常需要注意的点就是else悬空问题.
#include<stdio.h>
int main()
{
int a = 0, b = 1;
if (a == 1)
if (b == 1)
printf("hello");
else
printf("world");
}//这段代码的运行结果到底是什么呢?是不是world呢?
很遗憾,这段代码并不会有任何的结果,而且else也并不是和第一个if对齐的,这只是我们的一种排版,当你使用编译器的自动排版以后,你会发现else其实是和第二个else对齐的。而else悬空就是else会自动和离它最近的没有配对的if配对,这就是所谓的近水楼台先得月吧。
表达式的值
注意,本篇博客最重要的核心就是表达式的值,首先我们可以确认的是,只要不是问题表达式,表达式都会有一个确定的值,那么表达式的值我们该如何确定呢?我总结了几个要点
1.判断表达式的值
首先我们要知道的是C语言中0代表假,非0的数代表真。其次,判断表达式的结果为真时判断表达式代表的值就是1,因为二进制中只有1和0。
那么这句话是什么意思呢,我们来看一下这个简单的代码
#include<stdio.h>
int main(){
int a=5,b=3,c=8;
int d=(a>b),e=(b>c); //a>b表达式为真,b>c表达式为假
printf("%d %d",d,e); //那么程序的运行结果是什么呢
return 0;
}//答案是1 0
看完这个代码,相信大家能理解什么是判断表达式的值了吧
2.赋值表达式的值
在C语言的程序中,我们经常可以见到赋值号'=',那么赋值表达式的值是多少呢?答案很简单,赋值表达式的值就是赋值号右边的值,下面来举一个例子。
#include<stdio.h>
int main(){
int a,b;
if(a=5) //分支结构1
printf("%d\n",a);
else
printf("表达式为假\n");
if(b=0) //分支结构2
printf("%d",b);
else
printf("表达式为假");
return 0;
}
上面的两个判断条件都是赋值表达式,
那么输出的结果是什么呢?希望大家可以简单思考一下
答案是5
表达式为假,相信看完这个代码大家应该更了解赋值表达式的值了吧
3.复合表达式的值
接下来讲最后一点也是比较容易搞错的一点,首先复合表达式是什么呢,他不是简单的一个判断表达式和或者赋值表达式或者是一个常量,而是由简单的赋值表达式和判断表达式进行复合完成的
复合表达式1
a<b<c
复合表达式2
a=b=c
复合表达式3
a=b>c
这三个复合表达式简单并且容易理解接下来会一一讲解
复杂一点的就需要大家在做题中积累经验了
我总结了一句话复合表达式要根据优先级和结合性将复合表达式分为简单的赋值和判断表达式并且将表达式用它的值进行替换后一步一步运算,直到最后计算成为一个常量
优先级和结合性大家现在不了解没关系,在这里对于我们的理解也并不重要,接下来我将带着大家将上述的三个表达式进行讲解
首先是表达式1,a<b<c
#include<stdio.h>
int main(){
if(4<2<3) //分支1
printf("hehe");
if(4>2>3) //分支2
printf("hehe");
if(4<3>2) //分支3
printf("hehe");
}
请问一共会输出几个hehe呢?
我们一个一个进行分析,
首先是分支1:
小于号的优先级一致,结合性是从左往右,4<2为假,表达式值为0
则4<2<3可以按照规则等价为0<3,显然结果为真,输出hehe
然后是分支2:
大于号的优先级一样,结合性从左往右,4>2为真,表达式值为1
1>3为假,不打印hehe
最后是分支3:
大于号小于号优先级结合性一致,4<3为假,表达式值为0
0>2表达式为假,不输出hehe
所以只有一个hehe
复合表达式2比较简单,和复合表达式3一起讲解
#include<stdio.h>
int main() {
int a, b;
if (a = b = 4) //类型为复合表达式2
printf("%d %d ",a,b);
if (a = 5 > 3) //类型为复合表达式3
printf("%d", a);
return 0;
}
让我们一步一步分析代码
首先是a=b=c
等号优先级一致,结合性从右往左
b=4,表达式值为4,然后a=4,结果为真打印a和b的值
结果为4 4
再看这个a=5>3
大家可能会觉得输出结果是5,但结果很简单是1
首先=的优先级低于>,所以先进行了5>3的判断
而结果为真表达式5>3的值为1
所以最后表达式为a=1
显然打印结果是1
复合表达式3的情况相对复杂,但大家记住这三个规则,然后多做点题目就能理解了
if的嵌套使用
函数可以嵌套使用,同样if也是可以嵌套使用的,这个时候就比较考验我们的代码风格了,代码风格不好的时候读程序会有一定的困难,建议大家在使用嵌套if时候加上{}
直接上一道典型的判断闰年来为大家讲解if的嵌套
我们都知道闰年有两种情况能被四整除但不能被一百整除和能被四百整除的
其实可以直接用if(n%400==0||(n%4==0&&n%100!=0));来替换
但我需要要用嵌套的形式给大家讲解if嵌套
#include<stdio.h>
int main() {
int n;
printf("please input a number:");
scanf("%d", &n); //首先我们输入一个年份
if (n % 4 == 0)
{ //第一个if嵌套结构,判断n是否被4整除
//被四整除则进入下一层判断,不能则输出不是闰年
if (n % 100 == 0) //接着判断是否被100整除,不能则输出是闰年,能则进入下一层嵌套
{
if (n % 400 == 0) //接下来是最后一层if嵌套,整除四百则为闰年,不能则不是
printf("%d is a leap year",n);
else
printf("%d isn't a leap year", n);
}
else
printf("%d is a leap year", n);
}
else
printf("%d isn't a leap year", n);
return 0;
}//大家可以发现每次嵌套我都会加上一个{}来增加代码的可读性
看完这个程序相信大家已经能理解什么if嵌套了,这一次的分享结束,希望能对大家的学习有所帮助