“long long”是否等同于“long long int”、“long int long”和“int long long”?

158

我发现long int longint long long都可以编译成变量类型。那么long int longint long longlong longlong long int有什么区别吗?

一般来说,如果一个类型有相同数量的long,它们是否相同?

1个长整型(long):

long l;
int long il;
long int li;

长度过长:

long long ll;
int long long ill;
long int long lil;
long long int lli;

如果以上是正确的,那么以下的声明是否也相同?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;

8
请使用 std::swap 进行测试(仅限于您的编译器)。如果类型不相同,则无法编译。请注意不要改变原意,使翻译通俗易懂。 - Bathsheba
1
相关:https://dev59.com/TXRB5IYBdhLWcg3wj32c - TobiMcNamobi
26
投票重新开放。所谓的重复问题是相关的,但不是这个问题。那里的答案并不能解决这个问题。关闭投票者请勿基于无知而投票关闭。 - Cheers and hth. - Alf
比较每个sizeof()以确保它们的大小。long long应该是64位,因此sizeof(l)应为8,如果sizeof(ill) == sizeof(lil),则您的编译器将视它们为相同。这对于您当前的编译器和您可能遇到的任何未来编译器都是正确的(直到sizeof()的消亡-希望永远不会发生,否则我需要进行严重的重写)。 - Michael Stimson
@MichaelStimson sizeof 不是一个函数,而是一个运算符。这意味着它不带括号书写。 - Kami Kaze
4个回答

144
根据 C++ 标准(7.1.6.2 简单类型说明符),当允许使用多个简单类型说明符时,它们可以与其他任意顺序的声明说明符自由混合。因此,例如以下声明是有效的。
long static long const int x = 10;

你甚至可以在 const 限定符与 constexpr 指示符一起使用。例如:

constexpr long static long const int x = 10;

顺便提一下,我们忘记了限定符signed!让我们在声明符x之前添加一个示例。

constexpr long static long const int signed x = 10;

在C语言中,您还可以在相同的声明限定符序列中使用多个类型限定符。根据C标准(6.7.3类型限定符)

5 如果同一个限定符在同一说明符-限定符列表中出现多次,无论是直接出现还是通过一个或多个typedef出现,行为与仅出现一次时相同....

因此,例如在C中,以下声明也是有效的。

const long const long static const int const signed x = 10;

如果你是按照程序中输入的符号数量来获得报酬的话,那么我建议你使用这样的声明。 :)


104
当你需要确保这个值永远不会改变时,绝对必须采取行动。 - Bob
3
很遗憾,通常评论不包括在这种计算中。 - Vlad from Moscow
9
即使写成#define REM(...)的形式,对于一个字数巨大的示例,i++; REM(在这里,我们递增i以确保i的新值比旧值大1。这是安全的,因为我们知道i的值小于i类型的最大值。) - user743382
5
@Bob说的是:“数据语句的主要目的是给常量命名,而不是将pi称为3.141592653589793……这也简化了修改程序,如果pi的值发生变化。” - chux - Reinstate Monica
17
在C语言中,“const const const ...”这样的限定符可以连续出现多次,不会导致编译错误。例如,代码“const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const answer = 42;”是可以成功编译的。 - Lucas Trzesniewski
显示剩余10条评论

116

类型相同吗...

是的。

C++11 §7.1.6.2/3

当允许多个简单类型指示符时,它们可以与其他声明说明符任意交错并以任何顺序出现。


43
是的,但请不要这样做。就像英语和德语有形容词和副词的传统词序一样(例如时间-方式-地点),C和C ++也有传统的词序。与传统顺序不同不会混淆编译器,但会混淆其他开发人员。我建议传统顺序大致如下:
  1. static/extern (链接)
  2. const/volatile(修改)
  3. signed/unsigned(签名)
  4. short/long(长度)
  5. 基本类型(主要名词)
虽然肯定有些灵活性。

31

“long long” = “long long int” = “long int long” = “int long long” 吗?

其他所有回答都谈到了你问题的第二部分。对于第一部分:“long long” = “long long int”?,答案是

C++11 7.1.6.2 简单类型说明符(表10)

Specifier(s)            Type
...                     ...
long long int           “long long int”
long long               “long long int”
long int                “long int”
long                    “long int”  
...                     ...  

对于你问题的第二部分:“long int long” = “int long long”吗?答案再次是肯定的。

类型说明符可以以任何顺序出现并与其他声明说明符混合使用。因此,以下所有内容都是有效的:

long long  
long long int  
long int long  
int long long  

是有效且等效的。


3
我不明白为什么你不改进@Cheers和hth。-阿尔夫的回答。 - Sebastian Mach
8
因为其他回答只涵盖了一半。它们都讨论了格式说明符的混合使用,但忽略了标题中问题的前半部分:“long long” = “long long int” = “long int long” = “int long long”吗? - haccks
5
有些人回答是为了得到声望奖励。编辑别人的答案来完善另一半的答案对于有效地给别人信用是需要付出很多工作的。 - user820304
1
真的。起初这似乎只是一个小小的补充。(抄送:@Thebluefish) - Sebastian Mach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接