B&R 在他们的《C 编程语言》一书中说 - 枚举提供了一种将常量值与名称关联起来的便捷方法,它是 #define
的替代方案,其优点是这些值可以为您生成。
所以我为 -1L、1U 和 1UL 定义了枚举常量。结果不是我所期望的,两种情况应该是一样的。
#include<stdio.h>
#define NEGATIVE_SIG_LONG -1L
#define UNSIG_INT 1U
#define UNSIG_LONG 1UL
main()
{
enum { ENUM_NEGATIVE_SIG_LONG = -1L, ENUM_UNSIG_INT = 1U, ENUM_UNSIG_LONG = 1UL};
printf("-1L < 1U: %d\n", -1L < 1U); // outputs: 1
printf("-1L > 1UL: %d\n\n", -1L > 1UL); // outputs: 1
printf("-1L < 1U: %d\n", NEGATIVE_SIG_LONG < UNSIG_INT); // outputs: 1
printf("-1L > 1UL: %d\n\n", NEGATIVE_SIG_LONG > UNSIG_LONG); // outputs: 1
printf("-1L < 1U: %d\n", ENUM_NEGATIVE_SIG_LONG < ENUM_UNSIG_INT); // outputs: 1
printf("-1L > 1UL: %d\n", ENUM_NEGATIVE_SIG_LONG > ENUM_UNSIG_LONG); // outputs: 0, expected 1
return 0;
}
最佳答案
在 C 中,枚举常量的类型为 int
.
来自 C 标准(6.4.4.3 枚举常量)
2 An identifier declared as an enumeration constant has type int
所以在这次通话中
printf("-1L < 1U: %d\n", ENUM_NEGATIVE_SIG_LONG < ENUM_UNSIG_INT); // outputs: 1
这里使用了表达式
-1 < 1
结果为 1。
在此通话中
printf("-1L > 1UL: %d\n", ENUM_NEGATIVE_SIG_LONG > ENUM_UNSIG_LONG); // outputs: 0, expected 1
这里使用了表达式
-1 > 1
产生0
.
至于这些调用
printf("-1L < 1U: %d\n", -1L < 1U); // outputs: 1
printf("-1L > 1UL: %d\n\n", -1L > 1UL); // outputs: 1
那么似乎signed long类型可以包含unsigned int类型的所有值。所以表达式
-1L < 1U
产量1。
另一方面,类型 signed long
无法包含 unsigned long
类型的所有值。常见类型为 unsigned long
。所以表达式-1
L 转换为类型 unsigned long
并产生该类型的大于 1UL
的最大值.
注意main函数的返回类型为int
.
int main( void )
关于c - 当 -1L、1U 和 -1UL 是符号常量时,-1L < 1U 和 -1L > UL 的输出与声明为枚举常量时不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64341409/