• C++关系运算符(超详细)

    计算机擅长比较值以确定其中一个是否大于、小于或等于另一个。这些类型的操作很有价值,例如,它可以检测销售图表、确定收益和损失、对比数字以确保其在可接受的范围内以及验证用户给出的输入等。

    在 C++ 中比较数值数据时可以使用关系运算符。字符也可以使用这些操作符进行比较,因为在 C++ 中字符被认为是数字值。每个关系运算符确定两个值之间是否存在特定的关系。

    例如,大于运算符(>)确定某值是否大于另一个值,相等运算符(=)确定两个值是否相等。表 1 列出了 C++ 所有的关系运算符。

    表 1 关系运算符
    关系运算符 含 义
    > 大于
    < 小于
    >= 大于或等于
    <= 小于或等于
    == 等于
    != 不等于

    所有关系运算符都是二进制的,这意味着它们使用两个操作数。以下是使用大于运算符的表达式的示例:

    x > y

    该表达式称为关系表达式,它用于确定 x 是否大于 y。以下表达式可以确定 x 是否小于 y:

    x < y

    关系的值

    那么,在程序中如何使用关系表达式呢?请记住,所有表达式都有一个值。关系表达式是布尔表达式,这意味着它们的值只能是真(true)或假(false)。如果 x 大于 y,则表达式 x>y 的值将为 true,表达式 x<y 的值则为 false。

    == 运算符确定其左侧的运算项是否等于右侧的运算项。如果两个运算项具有相同的值,则表达式的值为 true。假设 a 为 4,则以下表达式的值为 true:

    a == 4

    而以下表达式的值则为 false:

    a == 2

    注意,关系运算符中的等号运算符是两个 = 符号在一起。不要将此运算符与赋值运算符混淆,后者只有一个 = 符号。== 运算符确定变量是否等于另一个值,而 = 运算符则是将运算符右侧的值赋给左侧的变量。

    两个关系运算符实际上测试了一对关系。>= 运算符确定其左侧的运算项是否大于或等 于右侧的运算项。例如,如果 a 为 4,b 为 6,c 为 4,则以下两个表达式均为 true:

    b >= a
    a >= c

    而以下表达式则为 false:

    a >= 5

    操作符 <= 确定其左侧的运算项是否小于或等于右侧的运算项。沿用上例,如果 a 是 4, b 是 6,c 是 4,则以下两个表达式的值都是 true:

    a <= c
    b <= 10

    并且以下表达式则为 false:

    b <= a

    最后一个关系运算符是 !=,这是不相等的运算符。它确定其左侧的运算项是否不同于(即不等于)右侧的运算项,它与 == 操作符相反。如前所述,如果 a 为 4,b 为 6,c 为 4,则以下两个表达式均为 true:

    a != b
    b != c

    这些表达式的值是 true,因为 a 不等于 b,b 不等于 c。但是,以下表达式为 false,因为 a 等于 c:

    a != c

    表 2 显示了其他关系表达式及其 true 或 false 值。

    表 2 关系表达式示例(假设 x 为 10,y 为 7)
    表达式
    x < y false,因为 x 不小于 y
    x > y true,因为 x 大于 y
    x >= y true,因为 x 大于或等于 y
    x <=y  false,因为 x 不小于或等于 y
    y != x true,因为 y 不等于 x

    真值和假值

    如果关系表达式可以评估为 true 或 false,那么这些值在程序内部是如何表示的?计算机如何在内存中存储真值(true)?又如何存储假值(false)?

    在 C++ 中,这两个抽象状态被转换为数字,即零被认为是 false,而任何非零的值都被认为是 true。C++ 关键字 false 被存储为 0,关键字 true 被存储为 1。当关系表达式为 false 时,它将被评估为 0。但是,当关系表达式为 true 时,并不总是被评估为 1。虽然它一般会被评估为 1,但是实际上它可以被评估为任何非零值。

    为了更充分地说明,看一个程序:

    // This program displays the values C++ uses to represent true and false.
    #include <iostream>
    using namespace std;
    
    int main()
    {
        bool trueValue, falseValue;
        int x=5, y = 10;
        trueValue = (x < y);
        falseValue = (y == x);
        cout << "True is " << trueValue << endl;
        cout << "False is " << falseValue << endl;
        return 0;
    }

    程序输出结果:

    True is 1
    False is 0

    来仔细研究一下程序中包含关系表达式的语句:

    trueValue = (x < y);
    falseValue = (y == x);

    这些语句可能看起来很奇怪,因为它们将比较之后的结果值赋给变量。在第一个语句中,变量 trueValue 被赋值为 x <y 的比较结果。因为 x 小于 y,表达式为 true,于是变量 trueValue 被赋给一个非零值。而在第二个语句中,表达式 y = x 为 false,因此变量 falseValue 被设置为 0 值。

    在编写这些语句时,大多数程序员将关系表达式括在括号中,如上所示,以使之更清晰。当然,实际上并不需要括号,因为即使没有它们,在执行赋值操作之前也将先执行关系操作。这是因为关系运算符的优先级高于赋值运算符。同样,算术运算符的优先级高于关系运算符。

    例如,以下语句:

    result = x < y - 8;

    相当于语句:

    result = x < (y - 8);

    在这两种情况下,都是首先评估 y-8,然后将结果值与 x 进行比较。不过请注意,第二个语句要更清楚一些。当需要在关系表达式中使用一个算术表达式时,那么使用括号将后者括起来总是一个好王意。

    表 3 显示了包含关系表达式的其他语句示例。

    表 3 包含关系表达式的语句(假设 x 为 10,y 为 7,z 是 int 或 bool 变量)
    语 句 结 果
    z = x <y z 被赋值为 0,因为 x 不小于 y
    cout<< (x > y); 显示 1,因为 x 大于 y
    z = (x >= y); z 被赋值为 1,因为 x 大于或等于 y
    cout<<(x <= y); 显示 0,因为 x 不小于或等于 y
    z = (y != x); z 被赋值为 1,因为 y 不等于 x
    cout<< (x = (y + 3)); 显示 1,因为 x 等于 y + 3

    关系运算符之间也有优先顺序。测试相等或不相等的两个运算符(== 和 !=)具有相同的优先级。测试相对大小的其他 4 个关系运算符具有相同的优先级。这 4 个相对关系运算符的优先级高于两个相等或不相等关系运算符。

    换句话说,>、>=、<、<= 的优先级大于 == 和 != 的优先级。

    以下是一个应用示例,如果 a = 9,6 = 24 和 c = 0,则以下语句显示 1:

    cout << (c == a > b);

    由于此表达式中运算符的相对优先级,首先计算 a>b。由于 9 不大于 24,所以评估为 false 或 0,然后评估 c = 0。因为 c 确实等于 0,所以这个计算结果为 true 或 1。将 1 插入到输出流中并进行打印。

更多...

加载中...