我发现long int long
和int long long
都可以为变量类型编译。 long int long
,int long long
,long long
和long 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;
答案 0 :(得分:131)
根据C ++标准(7.1.6.2简单类型说明符)
3当允许多个简单类型说明符时,它们可以自由使用 以任何顺序与其他decl-specifiers混合。
例如,以下声明有效
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如果相同的限定符同时出现多次 specifier-qualifier-list,直接或通过一个或多个typedef, 行为就像它只出现一次一样......
因此,例如在C中,以下声明也是有效的
const long const long static const int const signed x = 10;
因此,如果您根据程序中输入的符号数量获得报酬,那么我建议您使用此类声明。 :)
答案 1 :(得分:109)
类型是否相同......
是
C ++11§7.1.6.2/ 3
“当允许多个简单类型说明符时,它们可以与其他 decl-specifiers 自由混合 任何订单。
答案 2 :(得分:40)
是的,但请不要。正如英语和德语对形容词和副词(例如时间 - 地点)的常规单词顺序一样,C和C ++也是如此。改变传统的顺序不会让编译器感到困惑,但会让你的开发人员感到困惑。我建议传统的顺序大致与
一致static
/ extern
(链接)const
/ volatile
(修改)signed
/ unsigned
(签名)short
/ long
(长度)虽然肯定会有一些摆动的空间。
答案 3 :(得分:28)
是“long long”=“long long int”=“long int long”=“int long long”?
这里的所有其他答案都谈到了你问题的第二部分。对于第一部分:是“long long”=“long long int”?,回答是是。
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
有效且等效。