在C中,是以下等价物:
long int x = 3L;
(请注意L
)
和
long int x = 3
他们似乎是一样的。如果是,应该使用哪一个?是否应明确指定L
?
如果它们不同,有什么区别?
答案 0 :(得分:8)
3.14L
是long double
字面值,而3.14
是double
字面值。在这种情况下它没有太大区别,因为它们都用于初始化long int。结果将是3。
编辑:
好的,3L
是long
字面值,而3
是int
字面值。它仍然没有多大区别,因为int
将被“提升”到很长时间。两种情况下的结果都是一样的。
编辑2: 它可能会产生影响的地方是这样的:
printf("%ld\n", 123);
这是未定义的行为,因为格式字符串指定了long
并且只传递了int
。这是正确的:
printf("%ld\n", 123L);
答案 1 :(得分:1)
没有后缀的十进制整数常量具有 - 取决于其值 - 类型int
,long
,long long
,或者可能是实现定义的扩展有符号整数类型,其范围大于long long
。
添加L
后缀表示类型至少为long
,LL
后缀表示该类型至少为long long
。
如果使用常量初始化变量,添加后缀没有区别,因为无论如何该值都将转换为目标类型。但是,常量的类型可能与更复杂的表达式相关,因为它会影响运算符语义,参数提升以及可能还有其他我现在没想到的事情。例如,假设为16位int
类型,
long foo = 42 << 20;
调用未定义的行为,而
long bar = 42L << 20;
定义明确。