「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。タイプが同一でない場合、これはコンパイルされません。
バトシェバ2015年


24
再開に投票しました。申し立てられた重複は関連していますが、これはこの質問ではありません。向こうの答えはこの質問に答えません。成約者:無知に基づいて成約に投票しないでください。
乾杯とhth。-Alf


確実にそれぞれのsizeof()を比較してください。long longは64ビットである必要があるため、sizeof(l)は8である必要があります。sizeof(ill)== sizeof(lil)の場合、コンパイラはそれらを同じように認識します。これは、あなたが発生する可能性があることをあなたの現在のコンパイラおよび将来のコンパイラのためにtrueになります()はsizeofの終焉(まで-うまくいけば決してないであろうか、私が持っている深刻行うために書き換えの量を)。
Michael Stimson、2015年

回答:


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同じ修飾子が、直接または1つ以上のtypedefを介して、同じspecifier-qualifier-listに複数回出現する場合、動作は1回だけ出現する場合と同じです。

したがって、たとえばCでは次の宣言も有効です

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

したがって、プログラムに入力されたシンボルの数に応じて支払われる場合は、そのような宣言を使用することをお勧めします。:)


96
あなたが絶対的に、積極的に値が変化しないことを確認する必要があります。
Bob

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

111

タイプは同じですか...

はい。

C ++ 11§7.1.6.2/ 3

複数の場合、単純な型指定子 Sが許可され、それらは自由に他と混合することができる赤緯指定子任意の順序で。


2
ストレートシューター。+1。
einpoklum 2017

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  
...                     ...  

質問の2番目の部分については、「long int long」=「int long long」ですか?、答えは再びイエスです。

型指定子は任意の順序で使用でき、他の宣言指定子と混在させることができます。したがって、以下のすべて

long long  
long long int  
long int long  
int long long  

有効で同等です。


3
@Cheersとhthを改善しない理由がわかりません。-代わりにアルフが答えます。
セバスチャンマッハ

8
@phresnel; 他のすべての回答は半分しかカバーしていないためです。タイトルの質問の前半が欠落しているフォーマット指定子の混在についてすべて対処しました:「long long」=「long long int」 =「long int long」=「int long long」?
2015年

5
@phresnel担当者を獲得するインセンティブについて答える人もいます。他の誰かの答えを編集して、残りの半分の答えをカバーすることは、他の誰かに効果的にクレジットを与えるための多くの仕事です。

1
そうだね。最初、これはほんの小さな追加として現れました。(CC:@Thebluefish)
セバスチャンマッハ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.