【问题标题】:C++ Comparison between signed and unsigned integer expressions有符号和无符号整数表达式之间的 C++ 比较
【发布时间】:2017-04-09 05:35:43
【问题描述】:

我是 C++ 新手。我需要帮助解决此错误:

Item.cpp: In member function ‘char* ict::Item::sku() const’:
Item.cpp:65:36: warning: comparison between signed and unsigned integer 
expressions [-Wsign-compare]

这是给出错误的代码部分:

//in header file
char m_sku[MAX_SKU_LEN + 1];

//in cpp file
char* Item::sku() const
{
    int length = strlen(m_sku);
    char *arr = new char[length]();
    for (int i = 0; i <= strlen(m_sku); i++) {
        arr[i] = m_sku[i];
    }
    return arr;
}

【问题讨论】:

  • 将 int I 更改为 std::size_t 后者是无符号的,是 strlen() 返回的类型,它永远不会是负数。比较无符号整数和有符号整数可能会导致一些非常难以发现的问题,因此会发出警告。警告是因为两个整数都转换为无符号整数,如果一个是负数,它会变成一个很大的正数,所以你可以获得一些非常奇怪的结果。 stackoverflow.com/questions/5416414/signed-unsigned-comparisons 的可能重复项

标签: c++


【解决方案1】:

解决此问题的最直接方法是使i 成为无符号变量而不是有符号变量。可以使用size_t来匹配strlen的返回类型:

size_t length = strlen(m_sku);
char *arr = new char[length]();
for (size_t i = 0; i <= length; i++) {
    arr[i] = m_sku[i];
}

但要小心,因为同样的替换不适用于倒数到 0 的循环。

// oops! This is an infinite loop:
for (size_t i = length-1; i >=0; i--) {
    arr[i] = m_sku[i];
}

【讨论】:

    【解决方案2】:

    编写静态转换 (int)strlen(m_sku) 或反之 std::size_t i = 0。 这样比较的项目将是相同的。

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 2013-11-11
      • 2011-04-09
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多