前言:
在日常生活中我们会遇到很多选择问题,在C语言中我们会通过判断条件是否满足来选择是否执行指定的操作任务,或者从给定的两种或多种操作中选择其一。
目录
二、关系运算符,逻辑运算符,条件运算符,关系表达式,逻辑表达式,条件表达式
C语言中的条件判断
写好选择结构的前提是判断好这个选择的条件是什么,例如:我今天考试不及格需要补考,条件就是我考试是否及格了,及格的结果是不需要补考,不及格的结果是需要补考,很显然我通过判断条件来得到我的结果。再比如,周末去福州游玩,条件就是我这几天是否周末,如果不是则不去,如果是我就去福州游玩。
C语言的两种选择语句
(1)if语句,用来实现两个分支的选择结构;(2)switch语句,用来实现多分支的选择结构。
一、if语句实现选择结构
(1)if语句的格式以及实例解析
if(表达式)
{
语句 ;
}
首先if后面的()中填入表达式,在后面用{}括起来,可以写多语句也可以写单语句,如果不用花括号括起来,则容易出现程序错误,这是因为不用{}括起来,if语句默认最近的一条语句为if的选择结果。所以从代码习惯上我更偏向于都使用{}来括起语句。
例:使用if语句处理两个实数,从小到大的顺序输出两个实数
#include<stdio.h>
int main()
{
int a = 0, b = 0,t=0;
scanf("%d %d", &a, &b);
if (a > b)
{
t = a;
a = b;
b = t;
}
printf("%d %d", a, b);
return 0;
}
解析:当输入的值为a>b的时候满足if条件,进入后面{}内容,令变量t等于a,把b的值赋值给a,然后再把a的值通过t赋值给b,这样就完成了两个变量,a,b的值调换。最后通过printf函数输出a,b的值。
代码运行结果如下图所示
这样初步运用if语句解决选择结构就比较清晰了。
(2)if...else语句
if....else..的格式如下列代码所示
if(表达式)
{
语句 ;
}
else
{
语句 ;
}
if后的()跟随表达式,然后语句在{}中,else 语句则是其他情况,其后跟随的语句也写在{}中,当else语句没有时候便是前面提到的单if解决选择结构情况,所以else子句可选,可不选,既可以有,也可以没有。那么在{}中的语句既可以是单语句,也可以是一个复合语句,还可以是另一个if语句,这就是俗称的选择嵌套。那如果不止有两种选择情况呢?就要用到下面的if语句表达形式了
(3)if....else if....else语句
if (表达式)
{
语句 ;
}
else if(表达式)
{
语句 ;
}
else
{
语句 ;
}
该形式我就不多说了直接上例子
if(number > 500) cost = 0.15;
else if(number>300 && number<=500) cost = 0.10;
else if(number>100 && number<=300) cost = 0.075;
else cost = 0;
(4)选择结构嵌套的情况(初步介绍形式,后面有详细解说)
在遇到多种情况,if可以内嵌if语句,并且要注意else总是与它最近的未配对的if配对。
例如:用if语句表示分批次不同年龄的人
if(age>50 && age <= 60)
{
if(age<=55)
{
语句 ;
}
else
{
语句 ;
}
}
首先是个大条件的筛选在年龄范围50-60之间再用if选择了年龄为50-55的人,其余为另一批年龄范围的人。
二、关系运算符,逻辑运算符,条件运算符,关系表达式,逻辑表达式,条件表达式
(1)关系运算符和关系表达式
在前文我们使用了>来判断a是否大于b,在这个条件中,>就是一个比较符号,比较符(或者称之为比较运算符)就是关系运算符。所以“a>b”就是一个关系表达式,当满足a>b的时候,关系表达式的值就为真,不满足,则关系表达式的值就为假。
C语言提供六种主要的关系运算符:
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
前四个的运算符优先级相同,比后两个的运算符优先级高,后两个相等和不相等运算符优先级相同但比前四个低。(关于优先级的介绍,我会放在文章末尾介绍,感兴趣先可以点击目录跳转。)
关系表达式:
用关系运算符将两个数值或数值表达式连接起来的式子称作关系表达式。
例如:
a>b,a+b>b+c,(a=3)>(b=5),'a'<'b'。
(2)逻辑运算符和逻辑表达式
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,C语言主要有下⾯三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)。
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
在比较老一点的写法里“&&”也写作AND,“||”写作OR,“!”也写作NOT,这也就是与,或,非,在C语言中用这三种符号来代替这些逻辑运算符。
(1)逻辑取反运算符
逻辑非,!这是它的运算符,举个例子就好理解了,假设a的值为真,那么!a的值为假,假设
a的值为假,!a的值就为真。“!”是单目运算符,只要求有一个运算对象,如!(a>b)。
(2)与运算符
逻辑与,&&两个取地址符号就是与的运算符,它是一个双目运算符,它要求有两个运算对象,例如:(a>b)&&(b<c),当左右两侧同时为真的时候,这个逻辑表达式的值就为真,当其中有一个的值为假时,这个逻辑表达式的值就为假。
(3)或运算符
逻辑或,用两竖直线表示||逻辑或。它也是一个双目运算符,它要求有两个运算对象,例如:a||b,当左右两侧的值有一个为真那么这个逻辑表达式的值就为真,二者都为假的时候,这个逻辑表达式的值就为假。
在这三个逻辑运算符的优先级中,逻辑非的优先级是大于其余两个优先级的,至于逻辑运算符和关系运算符的优先级我会放到文章末尾总结。
逻辑表达式:
如之前阐述的一样,逻辑表达式的值应该是一个逻辑量“真”或“假”,C语言中表示逻辑结果用1表示“真”,用0表示“假”,但在判断一个量是否为“真”的时候,以0来表示假,非零表示真。
例如:
a和b的值分别为4和5,则a||b的值为1;
若a=4,则!a的值为0;
(3)条件运算符和条件表达式
条件运算符是由两个符号(?:)构成的,必须要一起使用,但它是一个三目运算符,必须要求有三个操作对象,同时它也是C语言中唯一一个三目运算符。
条件表达式的一般形式为:
表达式子1?表达式子2:表达式子3
如何理解这个条件表达式呢,就是说它会先执行表达式子1,如果这个式子的值为真,那么就到表达式子2,如果这个值为假,那么直接到表达式子3。
直接上例子!
max=(a>b?a:b);
先判断式子a>b,假设a>b,那么输出a为最大值,假设a<b,那么输出b为最大值。
条件表达式相当于一个不带关键字的if的if语句,用它处理一些简单的选择结构可以让程序变得更加简洁。
三、if语句嵌套的用法
在一个if语句中又包含一个或多个if语句称为if语句的嵌套,本文的if语句第四种形式就属于if语句的嵌套。尤其要注意if与else的配对,else总是与最近的未配对的if配对。在确认if的内外嵌套的时候,保持一个代码习惯就使用{}来确定范围,这样可以使代码较为清晰。
if(表达式)
{
if(表达式)
语句 ;
}
else
{
语句;
}
这样就确定了内嵌的if语句范围,让后一个else与第一个if配对。同时在多次使用大括号的情况下,可以提高代码可读性。
例题:输入一个数,它能被3整除,就输出“three”,也能被5整除,就输出“three and five”,还能被7整除的就输出“seven and five and three”
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 3 == 0)
{
if (a % 5 == 0)
printf("three and five");
else
if (a % 7 == 0)
printf("seven and five and three");
else
printf("three");
}
return 0;
}
输出三种结果如下图所示,该题重在让大家习惯if语句的嵌套,有时候简化代码或者提高代码可读性的时候说不定用得到。
四、switch语句处理多分支结构
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
switch语句的表达形式:
switch(表达式)
{
case 常量1: 语句;
case 常量2: 语句;
default: 语句;
}
在上述代码中,根据表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。注意:表达式中的值应当是整数类型(包括字符型),case后面跟一个常量(常量表达式),如case 'A';
1.switch语句可以没有default。
2.各个case语句出现次序不影响结果。例如,可以先出现default,然后再出现 case ‘A’。
3.一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构。最后一个default或者case可以不加。
4.多个case语句可以共同用一组语句。
case 'A':
case 'B':
case 'C':
语句;break;
switch语句练习:要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60~69分,D等为60分以下。成绩的等级由键盘输入。
#include<stdio.h>
int main()
{
char grade;
scanf("%c",&grade);
switch(grade)
{
case 'A':printf("85~100\n");break;
case 'B':printf("70~84\n");break;
case 'C':printf("60~69\n");break;
case 'D':printf("<60\n");break;
default:printf("enter data error!\n");
}
return 0;
}
总结:
1. case 和后边的整型常量之间必须有空格
2. 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
五、运算符优先级,以及运算符注意的点
因为在C语言中表达式是从左到右扫描求解的,所以根据优先级来排列到底先求解哪个,这种类似感觉先乘除后加减,目前有算术运算符,逻辑运算符,关系运算符,赋值运算符
这些优先级从小到大排列:赋值运算符 < && || < 关系运算符 < 算术运算符 < !(非)
如果要看细致的优先级呢,大家可以去这里:http://t.csdn.cn/Ec6Q6
例如: (a > b) && ( x > y) 就可以简化成 a > b && x > y
(!a) && (a>b) 可以简化成 !a || a> b
第一个需要注意的点就是关系运算符不宜连用,例如:
i < j < k
上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
(i<j)<k
上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法。
i < j && j < k
第二个需要注意的点就是逻辑运算符的一个小特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。
如以下代码:
if(month >= 3 && month <= 5)
右操作数是 month = 3 的 结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
对于 || 操作符是怎么样呢?
if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1。 所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
六、选择结构程序的举例
为了考虑学生隐私,现打算将学生成绩单科成绩ABCDE方式呈现,如果:
a: 学生成绩介于[90,100)间,请输出A
b: 学生成绩介于[80,90) 间,请输出B
c: 学生成绩介于[70,80) 间,请输出C
d: 学生成绩介于[60,70) 间,请输出D
b: 学生成绩介于[0,60) 间,请输出E
e: 否则请输出非法成绩
请输入一个成绩,然后输出该成绩对应的级别,如果成绩不在[0,100]间,输出非法成绩
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 90 && a <= 100)
{
printf("A");
}
else
if (a >= 80 && a < 90)
{
printf("B");
}
else
if (a >= 70 && a < 80)
{
printf("C");
}
else if (a >= 60 && a < 70)
{
printf("D");
}
else if (a >= 0 && a < 60)
{
printf("E");
}
else
{
printf("非法成绩");
}
return 0;
}
写一个程序,判断是否是闰年
#include<stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
{
printf("YES\n");
}
else if (year % 400 == 0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
//也可以简化成以下代码
//这里括号可以让代码更易理解
#include<stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}