C 三元运算符的意外结果

Posted

技术标签:

【中文标题】C 三元运算符的意外结果【英文标题】:Unexpected result of C Ternary Operator 【发布时间】: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;

【问题讨论】:

【参考方案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 感谢您提醒我添加解决方案。我还更改了溢出演示的代码以使其更干净。

以上是关于C 三元运算符的意外结果的主要内容,如果未能解决你的问题,请参考以下文章

在条件中使用三元运算符会产生意外的输出

javascript:使用三元运算符的意外评估行为

PHP速记三元运算符“?:”解析错误意外“:”

使用 Python 的三元运算符与 lambda 组合的意外输出

三元运算

三元运算