当 -1L、1U 和 -1UL 是符号常量时,-1L < 1U 和 -1L > UL 的输出与声明为枚举常量时不同
Output of -1L < 1U and -1L > UL is different when -1L, 1U and -1UL are symbolic constant than when they are declared as enum constant
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应该有return类型int
.
int main( void )
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应该有return类型int
.
int main( void )