关系运算符
生活中的一些问题如果仅从字面回答通常可以得到是/否、有/没有等类似的真或假的答复。程序世界也存在同样的对话:这两个数值相等吗,玩家是否掉进了陷阱里等等,程序中对于这些判定可以通过关系表达式来实现。C提供了6个关系运算符来构建相应的表达式:
> 大于
>= 大于或等于
< 小于
<= 小于或等于
它们具有相同的优先级。优先级仅次于它们的是相等性运算符:
== 等于(两个相等号)
!= 不等于
关系运算符的优先级比算术运算(+、-、…)符低。所以 3 + 6 > 5 解释为:
- 计算 3+6 的结果
- 判断 #1 的结果是否大于 5
在复杂的表达式中,为了清晰的表达正确的意图,也可以使用圆括号来约束计算顺序。
((3 + 6) > 5) == 0
真假值
表达式被应用于条件表达时,求值会得到一个真值或假值。在C中,0值代表假,非0值代表真。
0 // 假
66 // 真
-9 // 真
'0' // 真
"glimix.com" // 真
9 + (-9) // 假
对关系表达式求值,得到真假值,此时通常使用1代表真值。
int a = 9;
int b = 3;
3 > 5 // 0(假)
3 < 5 // 1(真)
a <= 5 // 0(假)
a >= b // 1(真)
a == b // 0(假)
b != 4 // 1(真)
如果你打印关系表达式的值,通常会是0或1。
#include <stdio.h>
int main()
{
int a = 9;
int b = 3;
printf("relational expression\tvalue\n");
printf("==============================\n");
printf("3 > 5 \t\t %d\n", 3 > 5);
printf("3 < 5 \t\t %d\n", 3 < 5);
printf("a <= 5 \t\t %d\n", a <= 5);
printf("a >= b \t\t %d\n", a >= b);
printf("a == b \t\t %d\n", a == b);
printf("b != 4 \t\t %d\n", b != 4);
return 0;
}
在上面这些例子中,我们刻意没有使用浮点数。关系运算符也可以用于浮点数。但要小心,在浮点数比较中只能使用'<'和'>'
。原因在于舍入误差可能造成两个逻辑上应该相等的数不相等,本质上还是由浮点数的表示机制所引起。
随着语言的发展,引入了布尔bool
类型用以更贴切的表达真与假,该类型定义在头文件stdbool.h
中,它有两个值,true
代表真值,false
代表假值。非0值、0值与true和false之间有等价关系,任何能转换为0值的表达式,其结果也是false,反之也成立。
#include <stdio.h>
#include <stdbool.h> // 引入bool类型
int main()
{
bool flag1 = 4 == 4; // == 优先级高于 =
printf("4 == 4 ==> %d\n", flag1);
bool flag2;
flag2 = (4 != 4); // 用圆括号让先计算 4!=4 的意图更加明显
printf("4 != 4 ==> %d\n", flag2);
return 0;
}
条件表达式(?:
)
生活中也有许多这样的情景:明天天气好的话,我们就去爬山,不然就宅在家里;A商城上这个价格更合适的话就定,不然就在B商城上买,等等。C语言提供了条件表达式 ?:
,允许我们以程序的方式来书写这样的诉求,语法如下:
expr1 ? expr2 : expr3
首先计算表达式expr1,如果其值为值(不等于0),则计算expr2的值,并以该值作为条件表达式的值;否则计算expr3的值,并以该值作为条件表达式的值;显然,条件表达式提供了一种二选一的机制,即expr2与expr3中只能有一个表达式被计算。
上面生活中的那些问题用条件表达式可以这样模拟:
明天天气好 ? 去爬山 : 宅家里
A商城价格便宜 ? 去A商城 : 去B商城
同时,用C程序可以实现如下。关于程序有两点说明:第一:对于double类型使用比较运算符;第二:在第3个printf函数中,我“记不清”这些代码组合起来,那个表达式会优先计算,所以加上圆括号,以表达期望的计算顺序。
#include <stdio.h>
int main()
{
double a_price = 17.2;
double b_price = 14.7;
printf("%s ", a_price < b_price ? "JD" : "TM");
printf("%f\n", a_price < b_price ? a_price : b_price);
printf("%s %f\n",
(a_price > b_price ? "TM" : "JD"),
(a_price > b_price ? b_price: a_price));
return 0;
}
练习
- 编写程序验证字符’0’与字符串"glimix.com"的真假性。
- 改写条件表达式程序,让它具有如下图示输出。