int 自动转换为 unsigned int
Automatic conversion of int to unsigned int
#include <iostream>
using namespace std;
int main() {
unsigned int u = 5;
int x = -1;
if(x>u) {
cout<<"Should not happen"<<endl;
} else {
cout<<"Ok"<<endl;
}
}
此代码输出 Should not happen
。我在比较字符串的大小时(size_t 是一个无符号整数或无符号长整型值)与一个整数时遇到了这个问题。
似乎 C 类型将 int 转换为 unsigned int 但实际上,它似乎会带来错误。老实说,鉴于 int 与 unsigned int 的不兼容程度,我宁愿出现编译时错误。我想知道为什么约定是这样的?
您可以在 Clang 中启用 -Wsign-compare -Werror
:Try it online!
它会产生编译时错误(因为 -Werror
将警告视为错误):
.code.tio.cpp:7:9: error: comparison of integers of different signs: 'int' and 'unsigned int' [-Werror,-Wsign-compare]
if(x>u) {
~^~
1 error generated.
出于某种原因,-Wall -Werror
在 Clang 中(但在 GCC 中没有)不会产生任何错误。但是 -Wall -Wextra -Werror
确实包含 -Wsign-compare
,因此您可以使用它。
#include <iostream>
using namespace std;
int main() {
unsigned int u = 5;
int x = -1;
if(x>u) {
cout<<"Should not happen"<<endl;
} else {
cout<<"Ok"<<endl;
}
}
此代码输出 Should not happen
。我在比较字符串的大小时(size_t 是一个无符号整数或无符号长整型值)与一个整数时遇到了这个问题。
似乎 C 类型将 int 转换为 unsigned int 但实际上,它似乎会带来错误。老实说,鉴于 int 与 unsigned int 的不兼容程度,我宁愿出现编译时错误。我想知道为什么约定是这样的?
您可以在 Clang 中启用 -Wsign-compare -Werror
:Try it online!
它会产生编译时错误(因为 -Werror
将警告视为错误):
.code.tio.cpp:7:9: error: comparison of integers of different signs: 'int' and 'unsigned int' [-Werror,-Wsign-compare]
if(x>u) {
~^~
1 error generated.
出于某种原因,-Wall -Werror
在 Clang 中(但在 GCC 中没有)不会产生任何错误。但是 -Wall -Wextra -Werror
确实包含 -Wsign-compare
,因此您可以使用它。