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 -WerrorTry 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,因此您可以使用它。