签名/未签名比较和-Wall

时间:2010-08-13 10:06:25

标签: 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上的size方法)。由于循环中的测试是i> = 0,因此我必须签名或不起作用。看来我有三个选择;不要使用-Wall,忽略警告,或引入辅助元素......

    int          i;
    unsigned int j;

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

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

这些似乎都不是特别理想。你能否提出任何替代方案,或就这种情况下我应该做些什么做出推荐?

5 个答案:

答案 0 :(得分:3)

“由于循环中的测试是i> = 0,我必须签名或不起作用。”只需改变你的测试:

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

在循环体中给你相同的i值。

答案 1 :(得分:2)

使用'size_t'进行与尺寸相关的比较。

size_t i = 0;

答案 2 :(得分:1)

首先,将带符号的数字分配给无符号类型可能会产生非常严重的后果(签名的32位类型中的-1为无符号的4 294 967 295),这是存在该警告的原因之一。你可以在两个解决方案中的一个地方或另一个地方进行转换,无论你使用哪一个,只需将size()转换为有符号整数即可获得相同的效果。

这些方面的内容可以消除漏洞(未检查正确性)

for(unsigned int i=0;i<start;i++)
{
if(start-i>number1.array.size()) one_value=0;
}

我认为:)

答案 3 :(得分:0)

你可以尝试:

unsigned int i;

for (i = start; i > 0; )
{

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

}

答案 4 :(得分:-1)

这应该与您的代码相同 -
istart1(而不是start-10),并且相应地更改了数组大小的测试。

unsigned int i;

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