c++ - 有符号/无符号比较和 -Wall

标签 c++ gcc gcc-warning

我最近开始使用 -Wall 编译器开关来尝试提高我的代码质量。它(正确地)给出了关于这个小片段的警告......

    int i;

    for (i = start - 1; i >= 0; i--)
    {
        if (i >= number1.array.size())
        {
            one_value = 0;
        }

因为 number1.array.size 是无符号的(它是 std::vector 上的大小方法)。由于循环中的测试是 i >= 0,因此必须对 i 进行签名,否则它不起作用。看来我有三个选择;避免使用 -Wall、忽略警告或引入辅助元素...

    int          i;
    unsigned int j;

    for (i = start - 1; i >= 0; i--)
    {
        j = i;

        if (j >= number1.array.size())
        {
            one_value = 0;
        }

这些似乎都不是特别可取的。您能否提出任何替代方案,或者就我在这种情况下应该做什么提出建议?

最佳答案

“由于循环中的测试是 i >= 0,因此必须对 i 进行签名,否则它不起作用。”只需像这样更改您的测试:

for(unsigned i = start; i--;) {
    // ...
}

在循环体中为您提供与 i 相同的值。

关于c++ - 有符号/无符号比较和 -Wall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3475841/

相关文章:

gcc - 如何在 RHEL7 上将 GCC 从 4.8 更新到 8.2

c++ - 重载下标运算符未按预期工作

c++ - sql::SQLString 行为

c++ - 是否有用于文件搜索的跨平台/C++ 库? (在硬盘上)

c - Visual Studio 和 GCC - 编译器差异

c++ - 引用初始化表格

c - 为什么在使用 gcc C 将 uint32 转换为 uint8 时没有警告

DEV-C++ 中的编译器错误

c - void __iomem * 和 void* __iomem 之间的区别?

c++ - 转换阴影检测和移除的开源代码