有符号和无符号整数表达式之间的比较?

时间:2017-02-07 22:16:35

标签: c++

目前正在编译我的set.cpp文件(我们必须根据set.h文件和test_set.cpp创建该文件)使用g ++编译器,我一直遇到这些警告:

set.cpp: In member function âvoid set::remove(const set::value_type&)â:
set.cpp:30: warning: comparison between signed and unsigned integer expressions
set.cpp: In member function âbool set::contains(const set::value_type&) constâ:
set.cpp:50: warning: comparison between signed and unsigned integer expressions
set.cpp: In function âset set_union(const set&, const set&)â:
set.cpp:65: warning: comparison between signed and unsigned integer expressions
set.cpp: In function âset set_intersection(const set&, const set&)â:
set.cpp:76: warning: comparison between signed and unsigned integer expressions
set.cpp: In function âset set_difference(const set&, const set&)â:
set.cpp:90: warning: comparison between signed and unsigned integer expressions
set.cpp: In function âbool is_subset(const set&, const set&)â:
set.cpp:104: warning: comparison between signed and unsigned integer expressions
set.cpp: In function âbool operator==(const set&, const set&)â:
set.cpp:118: warning: comparison between signed and unsigned integer expressions
    set.cpp: In function âstd::ostream& operator<<(std::ostream&, const set&)â:
set.cpp:131: warning: comparison between signed and unsigned integer expressions

我不确定这些是什么意思,并且想知道如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

您获得的警告很可能来自您的for循环:

示例:

void set::remove(const value_type& entry)
{
    for(int i = 0; i < used; i++) //the comparison in question is on this line
    {
       if(data[i] == entry)
       {
            data [i]  = data [used - 1];
            used --;
            return;
       }
    }
}

声明:i < used正在比较i intused,我假设它是无符号类型。

如果您要查看警告中指定的每个行号,我相信它们都会与您函数中的for循环相对应。

修复这些警告的最简单方法是将int替换为used所使用的任何类型。

例如,如果usedunsigned int你的for循环将成为:

void set::remove(const value_type& entry)
{
    for(unsigned int i = 0; i < used; i++) 
    {
        /*...*/
    }
}

答案 1 :(得分:1)

如果没有看到您的头文件,我假设used被定义为unsigned int。在您的循环中,您将i定义为int,从而导致您的警告。

因为有符号整数中的负值在无符号整数中求值为大的正数,因此比较这两者可能会导致意外结果。快速解决方案是将i的所有用途更改为unsigned intused使用的实际类型。