在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";
}
答案 0 :(得分:5)
两个版本的问题在于,您无法确定由负值/大值导致的值(如果char
确实是{{1},则值为负值})。这是实现定义,因为实现定义了signed char
是char
还是signed char
。
解决此问题的唯一方法是首先转换为适当的签名/未签名 char 类型:
unsigned char
或
if(x < (signed char)y)
省略此强制转换将导致实现定义的行为。
就个人而言,当使用字符作为数字时,我通常更喜欢使用if(x < (unsigned char)y)
和uint8_t
,正是因为这个问题。
这仍假设int8_t
的值在您平台上可能的(un)signed char
值范围内。如果int
可能不是这种情况(仅当sizeof(char) == sizeof(int) == 1
为16位时才可能!),并且您正在比较有符号和无符号值。
要避免此问题,请确保使用
char
或
signed x = ...;
if(x < (signed char)y)
如果你没有这样做,你的编译器会抱怨有关混合签名比较的警告。
答案 1 :(得分:3)
您的代码将编译并工作,用于某些工作定义。
您仍然可能会收到意外结果,因为y
是char
,这意味着其签名是实现定义的。结合未知的int大小将带来很大的乐趣。
另外,请写下你想要的字面文字,不要自己查看ASCII表。任何读者(你在5分钟内)都会感激不尽。
最后一点:避免使用gratuituous,他们不会做任何更好的事情,并可能隐藏编译器通常会警告的问题。
答案 2 :(得分:2)
是的,您可以将int
与某些char
进行比较,就像您可以将int
与某些short
进行比较一样,但可能会被视为不良风格。我会编码
if (x < (int)y)
或者像你一样
if (x < static_cast<int>(y))
我觉得这个案子有点过于冗长......
顺便说一句,如果您打算使用不是char
的字节,请考虑int8_t
<cstdint>
类型(等等...)
不要忘记,在某些系统上,char
默认为signed
,其他系统为unsigned
(您可以明确unsigned char
vs {{1} })。
答案 3 :(得分:1)
您建议的代码将编译,但我强烈推荐static_cast
版本。使用static_cast
,您将帮助读者了解您与整数的比较。