在 c++ 中比较 char 和 Int
Comparing char to Int in c++
在 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_t
和 int8_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 char
与signed char
)。
您建议的代码将编译,但我强烈建议使用static_cast
版本。使用static_cast
,您将帮助读者了解您与整数相比的内容。
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 声明具有两种类型的变量:"int char"
- 定义.cpp中常数int/char*
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- 将int/char插入数据库
- 从 std::vector 转换为<int> char[] C++
- 为什么INT(char)的比较不起作用
- 使用int+char组合uint8_t
- 为什么这个返回值?C++int/char混淆
- 向量到 int<char> 与向量<wchar_t>到 int
- Evaluate an int, char and int
- 接收错误"no matching function for call to 'getline(std::ifstream&, int&, char)'"
- reinterpret_cast<int*>(char*) vs. static_cast<int*>(static_cast<void*>(char*)) --
- 将类型int(C::*)(int, char)转换为类型int(int, char)
- 如何添加多位数的int和char,其中输出为int+char
- 是int, char也是抽象数据类型