【问题标题】:Unexpected result of C Ternary OperatorC 三元运算符的意外结果
【发布时间】:2022-01-11 01:35:17
【问题描述】:

我发现 C 三元运算符 (?:) 的一个奇怪行为。 在下面的代码中,b 和 c 的期望值都应该是 0,但 b 是 -2。 我检查了C operator precedence,并确保减号(-) 大于或等于(>=),它高于条件运算符(?:)。谁能解释一下为什么 b 和 c 的值不同?

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;

int main() {
        int i;
        vector<int> a;
        for (i = 0; i < 29; ++i)
                a.push_back(i);
        int b = 27 - a.size() >= 0 ? 27 - a.size() : 0;
        int c = 27 - 29 >=0 ? 27 - 29 : 0;
        cout << b << endl;
        cout << c << endl;
        return 0;
}

【问题讨论】:

    标签: vector conditional-operator


    【解决方案1】:

    查看vector的文档页面,size()方法的返回类型是size_t,等于一个unsigned long long。

    因此,当您执行27 - a.size() 时,这将导致溢出,从而使27 - a.size() &gt;= 0 运算符的结果为True。它与 C 运算符优先级无关。

    为了证明这一点,你可以这样做:

    #include <iostream>
    using std::cout;
    using std::endl;
    
    int main() {
            unsigned long long tmp = 29;
            cout << 27 - tmp << endl; //(this will be a super large integer.)
            return 0;
    }
    

    解决方案:

    解决方法很简单,在三元运算符的条件下,你可以在a.size()之前简单地添加一个类型转换(int)。 它可以是这样的:

    int b = 27 - (int) a.size() &gt;= 0 ? 27 - a.size() : 0;

    【讨论】:

    • 您已经在 OP 的代码中诊断出问题,甚至添加了您自己的代码来演示该问题。但是,您没有提供解决方案。
    • @Adrian 感谢您提醒我添加解决方案。我还更改了溢出演示的代码以使其更干净。
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2023-03-09
    • 2017-03-05
    • 2011-12-31
    • 1970-01-01
    • 2012-04-09
    • 2019-03-06
    相关资源
    最近更新 更多