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() >= 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() >= 0 ? 27 - a.size() : 0;
【讨论】:
您已经在 OP 的代码中诊断出问题,甚至添加了您自己的代码来演示该问题。但是,您没有提供解决方案。 @Adrian 感谢您提醒我添加解决方案。我还更改了溢出演示的代码以使其更干净。以上是关于C 三元运算符的意外结果的主要内容,如果未能解决你的问题,请参考以下文章