Несмотря на то, что проблема небольшая, в ней много всего происходит
typedef enum {bar,baz,last} en;
en foo = baz;
for(int i =bar; i<=last ; i++)
if(i==foo){
Также ответ @ lundin :
* Константы en
равны int
* Объектами типа en
являются char
, целочисленный тип со знаком или целочисленный тип без знака.
Код имеет 2 функции сравнения с int
и en
.
i<=last
i==foo
Еще Как я понял, только 2-й предупреждает о «сравнении целочисленных выражений разной подписи: 'int' и 'en'».
В первом случае i<=last
: last
- это константа en
, так что это просто int <= int
-> без предупреждения.
Но, как ни странно, если код был unsigned i
, i<=last
не предупреждает, даже если теперь это целое число выражения с разной подписью ».
Изменение последнего по-прежнему является« целочисленными выражениями с разной подписью », но без предупреждения.
// i==foo
(i&1)==foo
Заключение Предупреждение о« целочисленных выражениях с разной подписью »возникает, когда 2 выполнены условия:
- Типы разного знака (ракетостроение на вот этот).
- Компилятор завершает диапазон возможных значений стороны подписанный , а диапазон значений беззнакового не оба находятся в положительном подписанном диапазоне - или что-то в этом роде вот так.
Хотя наш человеческий анализ for(int i =bar; i<=last ; i++) if(i==foo){ printf("%i\n",i); }
не видит здесь проблемы сравнения, компилятор ее пропустил.