C++有符号和无符号整数表达式的比较

3

我是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;
}

3
int I 改为 std::size_t。后者是无符号类型,是由 strlen() 返回的类型,它永远不会是负数。比较有符号和无符号整数可能会导致一些非常难以找到的问题,因此会出现警告。这是因为两个整数都被转换为无符号数,如果其中一个是负数,则会变成一个很大的正数,因此可能会得到一些非常奇怪的结果。可能是 https://dev59.com/zG035IYBdhLWcg3wcvmS 的重复内容。 - doug
2个回答

3
最简单的解决方法是将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];
}

1

编写一个静态转换,将(int)strlen(m_sku)或者std::size_t i = 0相互转换,以便比较的项是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接