comparison is always true due to limited
От: Alca Украина  
Дата: 05.07.11 13:12
Оценка:
FreeBSD freebsd5.localdomain 5.5-RELEASE FreeBSD 5.5-RELEASE #0: Tue May 23 14:58:27 UTC 2006 root@perseus.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
gcc (GCC) 3.4.2 [FreeBSD] 20040728

#include <iostream>

int main() {
   unsigned short usYear = 2012;

    bool bRes = (usYear >= 0 && usYear <= 9999);
   
    std::cout << (int)bRes << std::endl;  

    return 0;
}


warning: comparison is always true due to limited range of data type


Почему ворнинг? Как его убрать?
Re: comparison is always true due to limited
От: Alca Украина  
Дата: 05.07.11 13:14
Оценка:
bool bRes = (usYear >= 0 && usYear <= 9999); //ругается на эту строчку
Re[2]: comparison is always true due to limited
От: kpcb Россия  
Дата: 05.07.11 13:24
Оценка:
Здравствуйте, Alca, Вы писали:

A>bool bRes = (usYear >= 0 && usYear <= 9999); //ругается на эту строчку


Заменить её на

bool bRes = usYear <= 9999;
Re[3]: comparison is always true due to limited
От: dilmah США  
Дата: 05.07.11 13:38
Оценка: 1 (1) +1 -3 :)
A>>bool bRes = (usYear >= 0 && usYear <= 9999); //ругается на эту строчку

K>Заменить её на


K>
K>bool bRes = usYear <= 9999;
K>


либо подумать а так ли нужно убирать все дурацкие ворнинги (может его прагмой убрать?)
Мне первоначальный вариант кода нравится больше
Re: comparison is always true due to limited
От: rg45 СССР  
Дата: 05.07.11 14:05
Оценка:
Здравствуйте, Alca, Вы писали:

A>
A>#include <iostream>
A>unsigned short usYear = 2012;
A>//...
A>bool bRes = (usYear >= 0 && usYear <= 9999);
A>


A>

A>warning: comparison is always true due to limited range of data type


A>Почему ворнинг? Как его убрать?


Можно написать так:
bool bRes = unsigned(usYear) <= 9999;

тем самым придав коду некоторый запас прочности на тот случай, если тип usYear вдруг изменится на знаковый. Да и нагляднее.
--
Re: comparison is always true due to limited
От: Dukhat  
Дата: 05.07.11 14:08
Оценка:
unsigned всегда >=0
Re[2]: comparison is always true due to limited
От: Dukhat  
Дата: 05.07.11 15:43
Оценка:
R>Можно написать так:
R>
R>bool bRes = unsigned(usYear) <= 9999;
R>

R>тем самым придав коду некоторый запас прочности на тот случай, если тип usYear вдруг изменится на знаковый. Да и нагляднее.

unsigned это unsigned int, а не unsigned short.
Зачем от двухбайтового приводить к четырех, но при этом все равно беззнаковому?
Re: comparison is always true due to limited
От: B0FEE664  
Дата: 05.07.11 16:09
Оценка:
Здравствуйте, Alca, Вы писали:

A>

A>warning: comparison is always true due to limited range of data type


A>Почему ворнинг?


Два варианта:
1) USHRT_MAX слишком мал
2) компилятор "слишком" умён и видит, что usYear никогда не меняется

A>Как его убрать?

Может const'ы добавить:
const unsigned short usYear = 2012;
const bool bRes = (usYear >= 0 && usYear <= 9999);

?
И каждый день — без права на ошибку...
Re[2]: comparison is always true due to limited
От: VladFein США  
Дата: 05.07.11 16:11
Оценка:
Здравствуйте, rg45, Вы писали:

R>Можно написать так:

R>
R>bool bRes = unsigned(usYear) <= 9999;
R>

R>тем самым придав коду некоторый запас прочности на тот случай, если тип usYear вдруг изменится на знаковый. Да и нагляднее.

Если тип изменится на знаковый, значит он допускает отрицательные значения. Зачем же Вы его так!
Re[2]: comparison is always true due to limited
От: Alca Украина  
Дата: 05.07.11 16:22
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Alca, Вы писали:


A>>

A>>warning: comparison is always true due to limited range of data type


A>>Почему ворнинг?


BFE>Два варианта:

BFE>1) USHRT_MAX слишком мал
BFE>2) компилятор "слишком" умён и видит, что usYear никогда не меняется

A>>Как его убрать?

BFE>Может const'ы добавить:
BFE>
BFE>const unsigned short usYear = 2012;
BFE>const bool bRes = (usYear >= 0 && usYear <= 9999);
BFE>

BFE>?

Так в оригинальном коде это и есть константа
Re[2]: comparison is always true due to limited
От: dilmah США  
Дата: 05.07.11 16:30
Оценка:
BFE>1) USHRT_MAX слишком мал

для него в стандарте есть гарантия что он >= 65535
Re[4]: comparison is always true due to limited
От: dilmah США  
Дата: 05.07.11 17:58
Оценка:
D>либо подумать а так ли нужно убирать все дурацкие ворнинги (может его прагмой убрать?)
D>Мне первоначальный вариант кода нравится больше

за что минусы то?

это работа оптимизатора -- прослеживать зависимости и устранять ненужные вычисления.
Программист вовсе не должен устранять их сам, наоборот, он должен стараться писать потупее.

В данном случае компилятор выдает варнинг потому что он программист мог ошибиться, написав тавтологию, но в данном конкретном случае это не ошибка, и код выглядит лучше с обоими сравнениями.
Re[5]: comparison is always true due to limited
От: uzhas Ниоткуда  
Дата: 05.07.11 18:35
Оценка:
Здравствуйте, dilmah, Вы писали:

D>В данном случае компилятор выдает варнинг потому что он программист мог ошибиться, написав тавтологию, но в данном конкретном случае это не ошибка, и код выглядит лучше с обоими сравнениями.

как я понимаю, ворнинг дан на сравнение >=0, которое выполнено всегда для беззнаковых типов
считаю его бестолковым и я бы отрубил его в свойствах проекта\мейкфайлах, но не в исходном коде
Re[6]: comparison is always true due to limited
От: ononim  
Дата: 05.07.11 18:49
Оценка: +3 -1
D>>В данном случае компилятор выдает варнинг потому что он программист мог ошибиться, написав тавтологию, но в данном конкретном случае это не ошибка, и код выглядит лучше с обоими сравнениями.
U>как я понимаю, ворнинг дан на сравнение >=0, которое выполнено всегда для беззнаковых типов
U>считаю его бестолковым и я бы отрубил его в свойствах проекта\мейкфайлах, но не в исходном коде
Варнинг может быть полезен. К взяли код предназначенный для работы с signed переменной, вкопипастили его в код с unsigned переменной. Код стал глючить. Почему — непонятно. А варнинг сразу подскажет.
Отключение варнингов — последнее дело. Если варнинг мона пофиксить в исходном коде — так и надо сделать.
Как много веселых ребят, и все делают велосипед...
Re[3]: comparison is always true due to limited
От: rg45 СССР  
Дата: 05.07.11 19:05
Оценка:
Здравствуйте, Dukhat, Вы писали:

R>>Можно написать так:

R>>
R>>bool bRes = unsigned(usYear) <= 9999;
R>>

R>>тем самым придав коду некоторый запас прочности на тот случай, если тип usYear вдруг изменится на знаковый. Да и нагляднее.

D>unsigned это unsigned int, а не unsigned short.


Спасибо, я в курсе.

D>Зачем от двухбайтового приводить к четырех, но при этом все равно беззнаковому?


Почему бы нет? Результат при этом будет ровно таким же, как если написать:

bool bRes = (0 <= usYear <= 9999);

О потере производительности в данном случае беспокоиться вообще не стоит — любой, даже самый убитый компилятор соптимизирует это без проблем. Так что приведение в данном случае носит чисто косметический характер и не имеет никаких эффектов, кроме улучшения наглядности и устранения лишнего ворнинга.
--
Re[3]: comparison is always true due to limited
От: rg45 СССР  
Дата: 05.07.11 19:07
Оценка:
Здравствуйте, VladFein, Вы писали:

R>>тем самым придав коду некоторый запас прочности на тот случай, если тип usYear вдруг изменится на знаковый. Да и нагляднее.


VF>Если тип изменится на знаковый, значит он допускает отрицательные значения.


Это в идеале, а на практике всяко бывает
--
Re[7]: comparison is always true due to limited
От: dilmah США  
Дата: 05.07.11 19:17
Оценка: +1
O>Отключение варнингов — последнее дело. Если варнинг мона пофиксить в исходном коде — так и надо сделать.

не нужно отключать варнинги, нужно задизеблить выдачу конкретного варнинга для конкретной строки, не меняя сам код
Re[6]: comparison is always true due to limited
От: uzhas Ниоткуда  
Дата: 05.07.11 19:29
Оценка:
Здравствуйте, uzhas, Вы писали:

U>считаю его бестолковым и я бы отрубил его в свойствах проекта\мейкфайлах, но не в исходном коде

не я один считаю его бестолковым
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12963
Re[4]: comparison is always true due to limited
От: VladFein США  
Дата: 05.07.11 20:48
Оценка:
Здравствуйте, rg45, Вы писали:

D>>Зачем от двухбайтового приводить к четырех, но при этом все равно беззнаковому?


R>Почему бы нет? Результат при этом будет ровно таким же, как если написать:

R>
R>bool bRes = (0 <= usYear <= 9999);
R>


Ну это вряд ли...
Ваш код — это:
bool bRes = ( (0 <= usYear) <= 9999);

где (0 <= usYear) превращается в 0 или 1, что ВСЕГДА меньше 9999
Re[7]: comparison is always true due to limited
От: jazzer Россия Skype: enerjazzer
Дата: 06.07.11 00:47
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, uzhas, Вы писали:


U>>считаю его бестолковым и я бы отрубил его в свойствах проекта\мейкфайлах, но не в исходном коде

U>не я один считаю его бестолковым
U>http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12963

Где он там бестолковый? Там лишь спор о том, под какой опцией его показывать

Этот варнинг очень правильный, потому что народ сплошь и рядом пишет return -1; а потом проверяет результат на >=0 (вместо != -1) и удивляется, почему это вдруг его код перестал работать — а это всего лишь потому что тип стал беззнаковым (например, при переезде на другую платформу char стал unsigned)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.