C中的端子L

C中的端子L,c,variables,C,Variables,在C中,是以下等效项: 长整数x=3L;注意L 及 长整数x=3 他们似乎是一样的。如果是,应该使用哪一种?应该明确指定L吗 如果它们不同,区别是什么?3.14L是一个长双字面值,而3.14是一个双字面值。在这种情况下,它不会有太大的区别,因为两者都被用来初始化一个长整型。结果将是3 编辑: 好的,3L是一个长文本,而3是一个整型文本。它仍然不会有多大区别,因为int将被提升为long。两种情况下的结果都是一样的 编辑2: 有一个地方可能会有所不同,那就是: printf("%ld\n", 12

在C中,是以下等效项:

长整数x=3L;注意L

长整数x=3

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

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

3.14L是一个长双字面值,而3.14是一个双字面值。在这种情况下,它不会有太大的区别,因为两者都被用来初始化一个长整型。结果将是3

编辑: 好的,3L是一个长文本,而3是一个整型文本。它仍然不会有多大区别,因为int将被提升为long。两种情况下的结果都是一样的

编辑2: 有一个地方可能会有所不同,那就是:

printf("%ld\n", 123);
这是未定义的行为,因为格式字符串指定一个长字符串,并且只传递一个int。这是正确的:

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

不带后缀的十进制整数常量根据其值具有int、long、long-long类型,或者可能是范围大于long-long的实现定义的扩展有符号整数类型

添加L后缀意味着类型至少要长,LL后缀意味着类型至少要长

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

调用未定义的行为,而

long bar = 42L << 20;

定义得很好。

我的主要问题是,既然我已经指定x是长整数,那么是否有必要写L,还是应该让长整数部分来处理它?@A:这里没有必要。还有其他可能需要的时候。但是你可以让类型提升在这里发挥作用。@Fred:很抱歉吹毛求疵,但你能给我一个例子说明它在哪里起作用吗?我问这个问题是因为我想知道是否应该明确指定L。你可能还需要L来写像1L这样的东西
long bar = 42L << 20;