当 -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。因此表达式 -1L 被转换为类型 unsigned long 并产生大于 1UL.

的该类型的最大值

注意函数main应该有return类型int.

int main( void )