我想尝试理解编译器在将枚举与无效值进行比较时的工作原理,以及程序在执行期间正在做什么。
我在工作中找到了奇怪的源代码,但不理解程序的行为,因为它没有给出我预期的结果。
我编写了下面的小程序来总结我的问题。
我创建了一个枚举类型E_Number,并用值-1实例化一个变量a。然后我对a执行比较,以检查它是否属于枚举范围。
(我知道,这真的很奇怪,但这正是我在源代码中发现的!)
我希望结果告诉我“不在范围内”,因为第一个条件(a >= FIRST_ENUM)失败了。但是它是第二个条件(a < NB_MAX_NUMBER)失败了,给了我正确的结果(请参见printf())...
如果我在if条件中将a强制转换为(int),我会得到预期的结果。
那么在执行期间会发生什么?程序是否将-1视为另一个可能的枚举值,该值将定位在NB_MAX_NUMBER之后?关于枚举的>和<运算符规则是什么?
``` 使用gcc编译程序: gcc program.c 运行程序: .\a.exe 输出结果: 不在范围内 第一个条件为真 第二个条件为假 我正在使用MINGW编译器(gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.2) ```
我在工作中找到了奇怪的源代码,但不理解程序的行为,因为它没有给出我预期的结果。
我编写了下面的小程序来总结我的问题。
我创建了一个枚举类型E_Number,并用值-1实例化一个变量a。然后我对a执行比较,以检查它是否属于枚举范围。
(我知道,这真的很奇怪,但这正是我在源代码中发现的!)
我希望结果告诉我“不在范围内”,因为第一个条件(a >= FIRST_ENUM)失败了。但是它是第二个条件(a < NB_MAX_NUMBER)失败了,给了我正确的结果(请参见printf())...
如果我在if条件中将a强制转换为(int),我会得到预期的结果。
那么在执行期间会发生什么?程序是否将-1视为另一个可能的枚举值,该值将定位在NB_MAX_NUMBER之后?关于枚举的>和<运算符规则是什么?
#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编译程序: gcc program.c 运行程序: .\a.exe 输出结果: 不在范围内 第一个条件为真 第二个条件为假 我正在使用MINGW编译器(gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.2) ```