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

C 输出-1L<;1U和-1L>;当-1L、1U和-1UL是符号常量时,UL与当它们声明为枚举常量时不同,c,enums,comparison,implicit-conversion,enumerator,C,Enums,Comparison,Implicit Conversion,Enumerator,B&R在他们的书《C编程语言》(The C Programming Language)中说,枚举提供了一种将常量值与名称关联起来的方便方法,这是#define的一种替代方法,其优点是可以为您生成值 所以我为-1L、1U和1UL定义了枚举常量。结果不是我所期望的,两种情况下都应该是一样的 #include<stdio.h> #define NEGATIVE_SIG_LONG -1L #define UNSIG_INT 1U #define UNSIG_LONG 1UL main()

B&R在他们的书《C编程语言》(The C Programming Language)中说,枚举提供了一种将常量值与名称关联起来的方便方法,这是
#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;
}
#包括
#定义负信号长-1L
#定义UNSIG_INT 1U
#定义UNSIG_LONG 1UL
main()
{
枚举{enum_NEGATIVE_SIG_LONG=-1L,enum_UNSIG_INT=1U,enum_UNSIG_LONG=1UL};
printf(“-1L<1U:%d\n”,-1L<1U);//输出:1
printf(“-1L>1UL:%d\n\n”,-1L>1UL);//输出:1
printf(“-1L<1U:%d\n”,负信号长1UL:%d\n\n”,NEGATIVE\u SIG\u LONG>UNSIG\u LONG);//输出:1
printf(“-1L<1U:%d\n”,ENUM\u NEGATIVE\u SIG\u LONG1UL:%d\n”,ENUM_NEGATIVE_SIG_LONG>ENUM_UNSIG_LONG);//输出:0,应为1
返回0;
}

在C中,枚举常量的类型为
int

int main( void )
来自C标准(6.4.4.3枚举常数)

2声明为枚举常量的标识符的类型为int

所以在这次通话中

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
这里使用了这个表达

-1 < 1
-1 > 1
-1L < 1U
这将产生
0

至于这些电话

printf("-1L < 1U: %d\n", -1L < 1U); // outputs: 1
printf("-1L > 1UL: %d\n\n", -1L > 1UL); // outputs: 1

编译器对前四条
printf()
语句发出警告:“负整数常量转换为无符号类型”。也,不是
int
类型的
enum
s吗?编译器在我的机器中没有给出类似的警告。请打开警告级别。我使用了选项
-Wall
始终使用
-Wall-Wextra-pedantic
编译时如何检查值
enum_NEGATIVE_SIG_LONG
enum_UNSIG_int
隐式转换并在这种情况下发出警报?@HasloVardos这是算术转换的一般情况。你应该考虑到这一点。