Я хотел бы попытаться понять, как работает компилятор, когда мы сравниваем перечисление с недопустимым значением, и что делает программа во время выполнения.
Я нашел странный исходный код во время своей работы и не понимал поведение программы, которая не давала мне ожидаемого результата.
Я написал следующую небольшую программу, чтобы подвести итог моей проблемы.
Я создаю перечисление E_Number и создаю переменную a
со значением -1
.Затем я выполняю сравнение на a
, чтобы проверить, относится ли оно к диапазону перечисления.
(Я знаю, это действительно странно, но это именно то, что я нашел в исходном коде!)
Я ожидал, что результат говорит мне Не в диапазоне из-заневыполнение первого условия (a >= FIRST_ENUM)
.Но именно провал второго условия (a < NB_MAX_NUMBER)
дал мне правильный результат (см. printf()
) ...
Если я разыграю a
в (int)
в условиях if
Я получаю исключительные результаты.
Так что же происходит во время казни?Программа рассматривает -1
в качестве другого возможного значения перечисления, которое будет позиционироваться после NB_MAX_NUMBER
?Какое правило для операторов >
и <
для enum?
#include <stdio.h>
#define FIRST_ENUM 0
typedef enum{
NUM_1 = FIRST_ENUM,
NUM_2,
NUM_3,
NB_MAX_NUMBER
}E_Number;
int main()
{
E_Number a = -1;
if ((a >= FIRST_ENUM) && (a < NB_MAX_NUMBER))
{
printf("In Range\n");
}
else
{
printf("Not in Range\n");
}
printf("1st condition = %s\n", (a >= FIRST_ENUM)?"TRUE":"FALSE");
printf("2nd condition = %s\n", (a < NB_MAX_NUMBER)?"TRUE":"FALSE");
return 0;
}
gcc program.c
. \ A.exe
Не в диапазоне
1-е условие = ИСТИНА
2-е условие = ЛОЖЬ
Я работаю с компилятором MINGW (gcc (x86_64-win32-seh-rev1, построенный проектом MinGW-W64) 4.9.2)