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;
}
发布于 2020-10-13 19:01:11
在C中,枚举常量具有int
类型。
来自C标准(6.4.4.3枚举常量)
2声明为枚举常量的标识符具有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
然后,似乎有符号的long类型可以包含类型无符号int的所有值。所以这个表达
-1L < 1U
收益率1.
另一方面,类型signed long
无法包含unsigned long
类型的所有值。常见的类型将是unsigned long
。因此,表达式-1
L被转换为unsigned long
类型,并产生大于1UL
的该类型的最大值。
注意功能主应该有返回类型的int
。
int main( void )
https://stackoverflow.com/questions/64341409
复制相似问题