C语言基础要素(012):关系运算

关系运算符

生活中的一些问题如果仅从字面回答通常可以得到是/否、有/没有等类似的真或假的答复。程序世界也存在同样的对话:这两个数值相等吗,玩家是否掉进了陷阱里等等,程序中对于这些判定可以通过关系表达式来实现。C提供了6个关系运算符来构建相应的表达式:

 >      大于
 >=     大于或等于
 <      小于
 <=     小于或等于

它们具有相同的优先级。优先级仅次于它们的是相等性运算符:

==      等于(两个相等号)
!=      不等于

关系运算符的优先级比算术运算(+、-、…)符低。所以 3 + 6 > 5 解释为:

  1. 计算 3+6 的结果
  2. 判断 #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;
}

在这里插入图片描述

练习

  1. 编写程序验证字符’0’与字符串"glimix.com"的真假性。
  2. 改写条件表达式程序,让它具有如下图示输出。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值