2

我最近开始使用 -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,因此必须对 i 进行签名,否则它不起作用。看来我有三个选择;避免使用 -Wall、忽略警告或引入辅助元素...

    int          i;
    unsigned int j;

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

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

这些似乎都不是特别可取的。您能否提出任何替代方案,或就在这种情况下我应该做什么提出建议?

4

5 回答 5

3

“由于循环中的测试是 i >= 0,因此必须对 i 进行签名,否则它不起作用。” 只需像这样更改您的测试:

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

在循环体中为您提供相同的 i 值。

于 2010-08-13T10:19:52.280 回答
2

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

size_t i = 0;
于 2010-08-13T10:20:40.700 回答
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;
}

我认为 :)

于 2010-08-13T10:28:54.033 回答
0

你可以试试:

unsigned int i;

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

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

}
于 2010-08-13T10:21:33.070 回答
-1

这应该与您的代码相同 -
istartto 1(而不是start-1to 0)运行,并且对数组大小的测试也相应更改。

unsigned int i;

for (i = start; i > 0; i--)
{
    if (i > number1.array.size())
    {
        one_value = 0;
    }
于 2010-08-13T10:09:18.677 回答