【问题标题】:Comparing char to Int in c++在 C++ 中将 char 与 Int 进行比较
【发布时间】:2014-05-17 23:40:08
【问题描述】:

在 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";
}

【问题讨论】:

  • 请注意,sizeof(int) == 1char 是无符号的是允许的,在这种情况下双方都将转换为 unsigned int。不过,这很不寻常。
  • 请避免使用幻数,写出你的意思:不是 68,而是'D'。此外,即使sizeof(int)&gt;1,也要注意实现定义的char 签名。

标签: c++ types casting char int


【解决方案1】:

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

解决此问题的唯一方法是先转换为适当的有符号/无符号 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)

如果你不这样做,你的编译器可能会抱怨混合签名比较的警告。

【讨论】:

【解决方案2】:

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

你仍然可能得到意想不到的结果,因为y 是一个char,这意味着它的签名是实现定义的。这与未知大小的 int 相结合会带来很多乐趣。

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

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

【讨论】:

    【解决方案3】:

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

    if (x < (int)y) 
    

    或者像你一样

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

    对于这种情况,我觉得有点过于冗长了......

    顺便说一句,如果您打算不使用 char 的字节,还请考虑来自 &lt;cstdint&gt;int8_t 类型(等等...)

    不要忘记,在某些系统上,char 默认为 signed,而在其他系统上,默认为 unsigned(您可以明确地使用 unsigned charsigned char)。

    【讨论】:

    • 从不知道这是一种糟糕的风格。只是通常比较不同的类型值很容易出错。
    • 无偿的演员表(尤其是 C 风格的演员表)通常被认为是不好的风格。
    • @Alan:嗯,我的评论与你一致,而我发布了。后来对答案的编辑虽然改变了这一点。该死的。
    【解决方案4】:

    您建议的代码将编译,但我强烈推荐static_cast 版本。使用static_cast,您将帮助读者了解您将什么与整数进行比较。

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2013-12-21
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多