Подпись / без знака сравнения и -Wall - PullRequest
2 голосов
/ 13 августа 2010

Я недавно начал использовать переключатель компилятора -Wall в попытке улучшить качество моего кода. Он дает (правильно) предупреждение об этом маленьком фрагменте ...

    int i;

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

потому что number1.array.size без знака (это метод размера в std :: vector). Поскольку тест в цикле 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 ]

3 голосов
/ 13 августа 2010

"Так как тест в цикле i> = 0, я должен быть подписан, или он не работает." Просто измените свой тест следующим образом:

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

Дает вам одинаковое значение i в теле цикла.

2 голосов
/ 13 августа 2010

используйте size_t для сравнения размеров.

size_t i = 0;
1 голос
/ 13 августа 2010

Прежде всего, присвоение номера со знаком типу без знака может иметь довольно серьезные последствия (-1 в 32-битном типе со знаком равно 4 294 967 295 в случае без знака), что является одной из причин такого предупреждения , Вы выполняете преобразование в одном или другом месте в обоих решениях, и независимо от того, какое из них вы используете, вы получите тот же эффект, просто приведя size () к целому числу со знаком.

Что-то в этом духе устранит уязвимость (не проверено на правильность)

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

Я думаю:)

0 голосов
/ 13 августа 2010

Вы можете попробовать:

unsigned int i;

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

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

}
0 голосов
/ 13 августа 2010

Это должно работать так же, как ваш код -
i запускается с start до 1 (вместо start-1 до 0), и тест на размер массива был соответствующим образом изменен.

unsigned int i;

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