C中的终端L.

时间:2011-02-25 21:33:02

标签: c variables

在C中,是以下等价物:

long int x = 3L;(请注意L

long int x = 3

他们似乎是一样的。如果是,应该使用哪一个?是否应明确指定L

如果它们不同,有什么区别?

2 个答案:

答案 0 :(得分:8)

3.14Llong double字面值,而3.14double字面值。在这种情况下它没有太大区别,因为它们都用于初始化long int。结果将是3。

编辑: 好的,3Llong字面值,而3int字面值。它仍然没有多大区别,因为int将被“提升”到很长时间。两种情况下的结果都是一样的。

编辑2: 它可能会产生影响的地方是这样的:

printf("%ld\n", 123);

这是未定义的行为,因为格式字符串指定了long并且只传递了int。这是正确的:

printf("%ld\n", 123L);

答案 1 :(得分:1)

没有后缀的十进制整数常量具有 - 取决于其值 - 类型intlonglong long,或者可能是实现定义的扩展有符号整数类型,其范围大于long long

添加L后缀表示类型至少为longLL后缀表示该类型至少为long long

如果使用常量初始化变量,添加后缀没有区别,因为无论如何该值都将转换为目标类型。但是,常量的类型可能与更复杂的表达式相关,因为它会影响运算符语义,参数提升以及可能还有其他我现在没想到的事情。例如,假设为16位int类型,

long foo = 42 << 20;

调用未定义的行为,而

long bar = 42L << 20;

定义明确。