首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C三元算子的意外结果

C三元算子的意外结果
EN

Stack Overflow用户
提问于 2021-12-05 14:40:07
回答 1查看 45关注 0票数 0

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

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2021-12-06 10:01:38

在查看向量的文档页之后,方法size()的返回类型是size_t,它等于一个无符号的长。

因此,当您执行27 - a.size()时,这将导致溢出,使得27 - a.size() >= 0运算符的结果是True。它与C操作符优先级无关。

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

代码语言:javascript
运行
复制
#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;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70235394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档