#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;
}
}
此代码输出不应发生
。 我在比较一个字符串(size_t是一个无符号int或无符号long long值)与int的大小时遇到了这个问题。 似乎C类型将int强制转换为无符号int,但实际上,它似乎会带来错误。 老实说,考虑到int与无符号int的不兼容程度,我更希望出现编译时错误。 我想知道为什么公约是这样的?
您可以在clang中启用-wsign-compare-werror
:联机尝试!
它将产生编译时错误(因为-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.
由于某种原因,Clang中的-wall-werror
(而不是GCC中的)不会产生任何错误。 但是-wall-wextra-werror
确实包含-wsign-compare
,所以您可以使用它。