0

此代码在使用 Visual Studio 2010 编译时

#include <cstdlib>
#include <cstdio>

int numbers[] = { 23, 24, 25, 25, 28, 20, 20 };

int main(void) {
    int d = -1, x=0;
    size_t count = sizeof(numbers) / sizeof(numbers[0]);

    if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)
        x = numbers[d+1];

    if (d <= count-2)
        x = numbers[d+1];
}

给我一个有符号/无符号不匹配警告 onif (d <= count-2)但不是 on if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)。为什么是这样?我已启用所有警告。

4

3 回答 3

1

在这种情况下,Visual C++ 编译器不会发出警告 C4018 是一个错误。请参阅 Microsoft Connect 错误报告“警告 C4018(有符号/无符号不匹配)对于 sizeof 运算符”。

该问题似乎仅与sizeof. 在比较中涉及无符号类型的常量值的其他情况下,编译器也无法发出警告。例如,如果您将-qualification 添加constcount,即使在您的第二次比较中也不会发出 C4018。

于 2012-04-13T23:07:15.620 回答
0

My guess is that it treats 2 as an int so promotes (sizeof(numbers) / sizeof(numbers[0]))-2) to an int because of the brackets and so the comaprison is int < int

于 2012-04-13T21:35:19.843 回答
0

size_t被定义为无符号,所以你得到一个有符号的无符号冲突。

请注意,正如sizeof在编译时评估的那样,并被一个常量值替换,它不会抱怨符号不匹配,但在另一个表达式中,您将值显式转换为 size_t 变量,当您尝试时可能会溢出与带符号的数字进行比较。

于 2012-04-13T21:38:23.533 回答