在 c++ 中比较 char 和 Int

Comparing char to Int in c++

本文关键字:Int char 比较 c++      更新时间:2023-10-16

在 C++ 中,是否可以因为隐式类型转换而将 int 与 char 进行比较?还是我误解了这个概念?

例如,我可以做吗

int x = 68;
char y;
std::cin >> y;
//Assuming that the user inputs 'Z';
if(x < y) 
{
 cout << "Your input is larger than x";
}

还是我们需要先将其转换为 int?

所以

 if(x < static_cast<int>(y)) 
{
 cout << "Your input is larger than x";
}

两个版本的问题在于您无法确定负值/大值产生的值(如果char确实是signed char,则为负值的值)。这是定义的实现,因为实现定义了char表示signed char还是unsigned char

解决此问题的唯一方法是先强制转换为适当的有符号/无符号字符类型:

if(x < (signed char)y)

if(x < (unsigned char)y)

省略此强制转换将导致实现定义的行为。

就个人而言,在使用字符作为数字时,我通常更喜欢使用 uint8_tint8_t,正是因为这个问题。


这仍假定(un)signed char的值在您的平台上可能的int值范围内。如果sizeof(char) == sizeof(int) == 1(仅当char为 16 位时才可能!),并且您正在比较有符号和无符号值,则可能并非如此。

若要避免此问题,请确保使用

signed x = ...;
if(x < (signed char)y)

unsigned x = ...;
if(x < (unsigned char)y)

如果您不这样做,您的编译器希望会抱怨混合符号比较的警告。

对于某些工作定义,您的代码将编译并工作

您仍然可能会得到意想不到的结果,因为y是一个char,这意味着它的符号是实现定义的。再加上未知大小的int将带来很多快乐。

另外,请写下您想要的字符文字,不要自己查看 ASCII 表。任何读者(5分钟内的你)都会感激不尽。

最后一点:避免无端的强制转换,它们不会让任何事情变得更好,并且可能会隐藏编译器通常会警告的问题。

是的,您可以将int与某些char进行比较,就像您可以将int与某些short进行比较一样,但它可能被认为是糟糕的风格。我会编码

if (x < (int)y) 

或者像你一样

if (x < static_cast<int>(y))

我觉得这种情况有点太啰嗦了......

顺便说一句,如果您打算使用字节char也请考虑<cstdint>中的int8_t类型(等...)

不要忘记,在某些系统上,默认情况下char signed,在其他系统上它们是unsigned的(您可以明确unsigned charsigned char)。

您建议的代码将编译,但我强烈建议使用static_cast版本。使用static_cast,您将帮助读者了解您与整数相比的内容。