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


153

我找到了两者,long int long并且int long long可以编译为变量类型。是否有任何区别long int longint long longlong longlong long int

通常,如果类型的数目相同,类型是否相同long

1长:

long l;
int long il;
long int li;

2长:

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 2015年


24
投票重新开放。所谓的重复是相关的,但这不是问题。那里的答案不能回答这个问题。封闭投票人:请勿基于无知而投票关闭。
干杯和健康。-阿尔夫


比较每个的sizeof()以确保。long long应该是64位,所以sizeof(l)应该是8位,如果sizeof(ill)== sizeof(lil),那么您的编译器会发现它们相同。这将是真正的为你当前的编译器和未来的任何编译器可能会遇到的(直到的sizeof的灭亡() -希望这将是永远或我有一个严重的重写做的量)。
Michael Stimson

Answers:


136

根据C ++标准(7.1.6.2简单类型说明符)

3当允许使用多个简单类型说明符时,它们可以以任何顺序与其他decl说明符自由混合。

因此,例如以下声明有效

long static long const int x = 10;

您甚至可以将constexpr限定符与const限定符一起使用。例如

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在同一specifier-qualifier-list中多次出现,则其行为与仅出现一次相同....

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

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

因此,如果根据程序中键入的符号数向您付款,那么我建议您使用此类声明。:)


96
绝对地,当您绝对要确保价值不会改变时。
鲍勃

3
@hvd不幸的是,通常不会从此类计算中删除注释。
弗拉德(Vlad),来自莫斯科

9
即使写成#define REM(...),然后举一个巨大的字数示例,i++; REM(Here, we increment i to make sure the new value of i is one more than the old value of i. This is safe because we know the value of i is less than the maximum value of i's type.)


15
您甚至不必混用限定词... 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 const const const const const const answer = 42;在C中编译就可以了:-)
Lucas Trzesniewski 2015年

111

类型是否相同...

是。

C ++ 11§7.1.6.2/ 3

当多个简单型说明符 s的允许的,他们可以自由地与其他混合DECL-说明符以任何顺序。


2
直射手。+1。
einpoklum

42

是的,但是请不要。正如英语和德语对形容词和副词的常规词序(例如时间-方式-地点)一样,C和C ++也是如此。与常规顺序不同不会使编译器感到困惑,但会使您的其他开发人员感到困惑。我建议常规顺序大致与

  1. static/ extern(链接)
  2. const/ volatile(修改)
  3. signed/ unsigned(签名)
  4. short/ long(长度)
  5. 基本类型(头名词)

虽然肯定有一些摆动的空间。


29

是“ 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。-Alf回答。
塞巴斯蒂安·马赫2015年

8
@phresnel; 因为所有其他答案仅涵盖一半。关于格式说明符混合的所有内容都缺少标题中问题的前半部分:“ long long” =“ long long int” =“ long int long” =“ int long long”吗?
c

5
@phresnel有人回答了获得代表的动机。编辑别人的答案以覆盖另一半答案是有效地给别人以功劳的大量工作。

1
真正。起初,这似乎只是次要的补充。(CC:@Thebluefish)
塞巴斯蒂安·马赫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.