我发现了C三元算子(?:)的一个奇怪的行为。在下面的代码中,b和c的期望值应该是0,但b是-2。我检查了C算子优先,并确保减号(-)大于或等于(>=),后者高于条件运算符(?:)。有人能解释一下为什么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;
}发布于 2021-12-06 10:01:38
在查看向量的文档页之后,方法size()的返回类型是size_t,它等于一个无符号的长。
因此,当您执行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;
}解决方案:
解决方案很简单,您可以在三元操作符的条件下,在(int)之前添加一个类型化的a.size()。它可以是这样的:
int b = 27 - (int) a.size() >= 0 ? 27 - a.size() : 0;
https://stackoverflow.com/questions/70235394
复制相似问题