为什么比较结果不符合预期?



你能解释一下为什么下面的代码会给出这些结果吗?

#include <iostream>
int main()
{
int x = -1;
unsigned int y = 1;
if (x > y)
std::cout << "true";
else
std::cout << "false";
}

输出=

这里发生的是从intunsigned int的隐式转换,它以以下方式发生:

int x = -a;
unsigned int y = x; //As far as y can hold only positive values, 
//it now holds UINT_MAX - (a + 1)

其中UINT_MAX为宏,定义为unsigned int所能容纳的最大值。

在您的示例中,x被转换为UINT_MAX, CC_7显然大于1

下面的代码:

int x = -1;
unsigned int y = 1;
bool result = x > y;

转换为:

int x = -1;
unsigned int y = 1;
bool result = operator>(x, y);

有两个操作符>功能定义:

bool operator>(int, int);
bool operator>(unsigned int, unsigned int);

但是你正在呼叫operator>(int, unsigned int)。所以编译器将你的有符号整型转换成无符号整型,然后调用operator>(unsigned int, unsigned int),这导致了一个错误。

避免这种情况的标准方法是打开编译器警告。你可以使用-Wconversion warning来警告你这个特定的问题,或者通过-Wall来打开所有警告。

要修复代码中的错误,可以显式地告诉编译器如何将实参转换为比较操作符

#include <iostream>
int main()
{
int x = -1;
unsigned int y = 1;
if (x > static_cast<int>(y))
std::cout << "true";
else
std::cout << "false";
}

但是要小心,因为如果unsigned int大于int可容纳的数字,它仍然可能导致错误。最安全的解决方案是使这两个变量在开始时都是相同的类型。

相关内容

  • 没有找到相关文章

最新更新