c - 当 -1L、1U 和 -1UL 是符号常量时,-1L < 1U 和 -1L > UL 的输出与声明为枚举常量时不同

标签 c enums comparison implicit-conversion enumerator

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/

相关文章:

c - LinkedList - C 中的类型 - 访问函数

c - 任务是计算圆周运动的两个物体之间的直线距离

c - system()函数字符串长度限制

java比较两个枚举

c - xCode 产生 "Undefined symbols for architecture x86_64"错误,而 gcc 编译没有错误

java - 在 Android 中使用枚举来自定义 View 属性

java - 最高序数枚举值

java - 如何组合并返回枚举值

javascript - javascript 字符串比较

javascript - 有什么方法可以区分js中的数组键类型吗? arr[1] !== 比 arr ["1"]