【问题标题】:Comparison warning比较警告
【发布时间】:2020-04-09 19:56:59
【问题描述】:

我正在做一个反转向量顺序的练习。我的程序可以运行,但我在下面执行的for 循环中收到警告:

    void reverse (vector<int>& v){
        for(int i=0; i<v.size()/2; ++i){
            swap(v[i],v[v.size()-1-i]);
        }
    }

for 循环的行中,我收到警告消息“有符号和无符号整数表达式之间的比较[-Wsign-compare]”。我正在使用 Stroustrop 的 Programming Principles and Practice Using C++,他基本上使用的是通用格式(没有 / 2)。我应该以不同的方式编写这个 for 循环吗?

【问题讨论】:

  • v.size() 的结果是无符号的(size_t 是无符号的)。因此i&lt;v.size()/2 是有符号与无符号的比较。由于您的i 永远不会是负数,您可以将i 定义为unsigned intuint32_tsize_t
  • 因为i 永远不会是负数,所以这里没有真正的问题。您的编译器警告您,您可能不够聪明,无法理解您编写的代码,应该考虑将其更改为编译器编写者认可的内容。

标签: c++ for-loop


【解决方案1】:

向量中的 size 函数返回一个 size_t,它基本上是一个无符号整数。当您收到这样的警告时,请检查您被警告的变量类型。摆脱警告的一种方法是更改​​循环变量

for(size_t i=0; i<v.size()/2; ++i)

问题是每次仍然计算 v.size()/2 。所以更好的方法是

for(size_t i=0, stop=v.size()/2; i < stop; ++i)

【讨论】:

    【解决方案2】:

    std::vector 类中的size() 函数返回一个size_t 值,该值始终定义为unsigned 类型(尽管其位宽可能因平台而异)。这通常适用于所有返回容器、数组或字符串大小值的标准函数(如std::strlen()),并且该类型也用作数组索引的 actual 类型,以及运算符的参数,例如作为new int[n]

    为避免出现警告,只需将循环变量 (i) 声明为 size_t 而不是(签名的)int

        void reverse (vector<int>& v){
            for(size_t i=0; i<v.size()/2; ++i){
                swap(v[i],v[v.size()-1-i]);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2021-11-13
      • 2016-12-15
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多