任务二 比较运算符、逻辑运算符
任务描述
通过本任务的学习,读者可以掌握C语言比较、逻辑运算符,以及相关的表达式的使用,此任务的相关的知识关系到后面程序结构中分支结构和循序结构的学习,所以大家要重视此任务的学习。
学习目标
掌握比较、逻辑运算符以及表达式。
熟悉比较、逻辑运算符的优先级。
相关知识
4-2-1 关系运算符与表达式
1、关系运算符,
C语言有六种关系运算符==(等于)、<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、!=(不等于)。关系运算符是用来比较两个值的关系,所以关系运算符又称“比较运算符”用于执行程序中的比较运算。
2、关系表达式
用关系运算符将两个表示连接起来的式子叫关系表达式,例如:a > b ,C 语言中所有关系运算符都是双目运算符,也就是说需要两个操作数参与运算。式例如下表4-4所示。
表 4-4关系运算符及运算符的使用
运算 |
范例 |
结果 |
|
== |
相等于 |
4 == 3 |
0 |
!= |
不等于 |
4 != 3 |
1 |
< |
小于 |
4 < 3 |
0 |
> |
大于 |
4 > 3 |
1 |
<= |
小于等于 |
4 <= 3 |
0 |
>= |
大于等于 |
4 >= 3 |
1 |
说明
- 关系运算符的结果要么是真(非0 表示),要么是 假(0 表示) 例如15<30的结果是1;’a’>’c’的结果是0。
(2) 比较运算符 "=="(关系运算符) 不能误写成 "=" (赋值)
(3) 关系表达式 经常用在 if结构的条件中或循环结构的条件中
通过下面的例子,来巩固关系运算表达式的使用,如4-5案例所示。
实例4- 5分析以下程序,输出其运行结果。
#include <stdio.h>
int main(){
char c='k';
int i=1, j=2, k=3;
float x=3e+5, y=0.85;
int result = x-5.25<=x+y;
printf( "%d\n", 'a'+5<c);
printf( "%d, %d\n", 1<j<5,result );
printf( "%d, %d\n", i+j+k==-2*j,k==j==i+5 );
return 0;
}
运行结果 如图4-6所示。
图4- 6 实例4-5的运行结果
上述案例中对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。
4-2-2 逻辑运算符与表达式
1.逻辑运算符
在C语言中使用&&(逻辑与)||(逻辑或)!(逻辑非)表示逻辑的三种运算符。
2.逻辑表达式
用逻辑运算符将关系表达式连接起来的就是逻辑关系表达式,最终的结果要么是真(非0 表示),要么是假(0 表示) 如下表4-5所示。
表 4-5逻辑运算符及运算符的使用
运算符 |
运算 |
范例 |
结果 |
! |
非 |
!a |
如果a为假,则!a为真; |
如果a为真,则!a为假 |
|||
&& |
与 |
a&&b |
如果a和b都为真,则结果为真否则为假 |
|| |
或 |
a|| b |
如果a和b有一个或以上为真,则结 |
果为真,二者都为假时,结果为假 |
说明
(1)逻辑运算符的结果要么是真(非0 表示),要么是 假(0 表示)例如35>25&&45<10左侧关系表达式为真,右侧的关系表达式为假,所以整个逻辑表达式的值为false。
(2) 逻辑表达式 经常用在 if结构的条件中或循环结构的条件中。
通过下面的例子,来巩固逻辑运表达式的使用,如4-6案例所示。
实例4- 6分析以下程序,输出其运行结果。
#include <stdio.h>
int main(){
int i=1,j=2,k=3;
float x=3e+4,y=0.88;
printf( "%d,%d\n", !i, !!i );
printf( "%d,%d\n", x>i&&j-3, i<j||x<y );
return 0;
}
运行结果 如图4-7所示。
图4- 7 实例4-6的运行结果
上述案例例中i=1,故!i其输出值为0,!i所有!!I=1。对x>i|| i && j-3式,先计算x>i的值为非0,再计算j-3的值为非0,再求x>i|| i && j-3的逻辑值为1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故i<j||x<y表达式的值为1。
4-2-3 sizeof运算符
1.sizeof运算符
同一种数据类型在不同的编译系统中所占的空间一定相同,例如,16位的系统中,int类型占用2个字节,而32位系统中,int类型占用了4个字节,为了获取数据类型在内存中的字节数,C语言提供sizeof运算符,来获取数据在内存中的字节,该运算符是 C 语言中唯一一个使用单词作为运算符的。
2.sizeof运算符的使用
sizeof用来求一个对象(数据类型名称)或是(变量)所占的内存大小(以字节为单位)。
实例4- 7 测试个类型在内存所占的字节数
#include<stdio.h>
int main()
{
//通过数据类型计算类型所占的空间大小
printf("char %d \n",sizeof(char));
printf("short %d \n",sizeof(short));
printf("int %d \n",sizeof(int));
printf("long %d \n",sizeof(long));
printf("float %d \n",sizeof(float));
printf("double %d \n",sizeof(double));
//通过变量名称计算变量所占的空间大小
int v_int =23;
int v_double=23.45;
printf("v_int %d \n",sizeof(v_int));
printf("v_int %d \n",sizeof(v_double));
return 0;
}
运行结果:如图4-8所示。
图4- 8 实例4-7运行结果
4-2-4 运算符优先级和结合性
学完了所有的成员的运算之后,我们把运算的符的优先级和结合性给大家总结一下,在针对一下复杂的表达式运算中能从容应对。表4-5列出了C语言中运算符的优先级,数字越小优先级越高。
表4-6运算符优先级和结合律
优先级 |
运算符 |
分类 |
结合性 |
1 |
. [] () |
|
从左至右 |
2 |
++ -- ~ ! (数据类型) |
单目运算符 |
从右至左 |
3 |
* / % |
双目运算符 |
从左至右 |
4 |
+ - |
||
5 |
<<>>>>> |
||
6 |
<><= >= |
||
7 |
== != |
||
8 |
& |
||
9 |
^ |
||
10 |
| |
||
11 |
&& |
||
12 |
|| |
||
13 |
?:(三目运算符) |
条件运算符 |
从右至左 |
14 |
= *= /= %= += -= <<= >>= >>>= &= ^= |= |
赋值运算符 |
|
15 |
, |
逗号运算符 |
从左至右 |
总结一下
(1) 结合的方向只有三个是从右向左,其余都是从左向右。
(2)所有的双目运算符中只有赋值运算符的结合方向是从右向左。
(3)另外两个从右向左的结合运算符,一个是单目运算,还有一个是三目运算() 。
(4)逗号的运算符优先级最低 。
(5)优先级的大概的顺序 :
算术运算符 > 关系运算符 > 逻辑运算符(逻辑 非! 除外) > 赋值运算符 > 逗号运算符 。
(6)注意不需要刻意的记, 常用就慢慢有印象。