Apakah "long long" = "long long int" = "long int long" = "int long long"?

153

Saya menemukan keduanya long int longdan int long longdapat mengkompilasi untuk tipe variabel. Apakah ada perbedaan antara long int long, int long long, long longdan long long int?

Secara umum, apakah jenisnya identik jika memiliki jumlah yang sama long?

1 panjang:

long l;
int long il;
long int li;

2 panjang:

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

Juga jika di atas benar, apakah pernyataan berikut ini juga identik?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;
ggrr
sumber
8
Cobalah (meskipun hanya di kompiler Anda) menggunakan std::swap. Ini tidak akan dikompilasi jika jenisnya tidak identik.
Batsyeba
1
Terkait: stackoverflow.com/questions/589575/…
TobiMcNamobi
24
Memilih untuk membuka kembali. Duplikat yang dituduhkan terkait tetapi bukan pertanyaan ini. Jawaban di sana tidak menjawab pertanyaan ini. Close-voters: tolong jangan memilih untuk menutup atas dasar ketidaktahuan.
Ceria dan hth. - Alf
Bandingkan ukuran masing-masing () untuk memastikan. Panjangnya harus 64 bit, jadi sizeof (l) harus 8, jika sizeof (ill) == sizeof (lil) maka kompiler Anda melihatnya sama. Ini akan berlaku untuk kompiler Anda saat ini dan setiap kompiler masa depan yang mungkin Anda temui (sampai runtuhnya sizeof () - yang diharapkan tidak akan pernah terjadi atau saya harus menulis ulang dengan serius untuk dilakukan).
Michael Stimson

Jawaban:

136

Menurut Standar C ++ (7.1.6.2 Penentu tipe sederhana)

3 Ketika beberapa penspesifikasi tipe sederhana diizinkan, mereka dapat secara bebas dicampur dengan penentu-pernyataan lainnya dalam urutan apa pun.

Jadi misalnya deklarasi berikut ini valid

long static long const int x = 10;

Anda bahkan dapat menggunakan constexprspecifier bersama dengan constkualifikasi. Sebagai contoh

constexpr long static long const int x = 10;

Omong-omong, kami lupa tentang specifier signed! Mari kita tambahkan misalnya sebelum deklaratorx

constexpr long static long const int signed x = 10;

Dalam C Anda juga dapat menggunakan beberapa jenis kualifikasi dalam urutan specifier menyatakan yang sama. Menurut Standar C (6.7.3 Jenis kualifikasi)

5 Jika kualifikasi yang sama muncul lebih dari satu kali dalam daftar specifier-qualifier yang sama, baik secara langsung atau melalui satu atau lebih typedef, perilaku tersebut sama seperti jika hanya muncul sekali ....

Jadi misalnya dalam C deklarasi berikut ini juga valid

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

Jadi, jika Anda dibayar sesuai dengan jumlah simbol yang diketik dalam program maka saya menyarankan Anda untuk menggunakan deklarasi seperti itu. :)

Vlad dari Moskow
sumber
96
Ketika Anda benar-benar, secara positif harus yakin nilainya tidak akan pernah berubah.
Bob
3
@ hvd Sayangnya biasanya komentar dikecualikan dari perhitungan seperti itu.
Vlad dari Moskow
9
Bahkan jika ditulis seperti #define REM(...), dan kemudian untuk contoh jumlah kata yang besar 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
Anda bahkan tidak perlu mencampurkan kualifikasi ... 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;mengkompilasi dengan baik di C :-)
Lucas Trzesniewski
111

Apakah jenisnya identik ...

Iya.

C ++ 11 §7.1.6.2 / 3

Ketika beberapa tipe-specifier sederhana diizinkan, mereka dapat secara bebas dicampur dengan specifier-specifier lain dalam urutan apa pun.

Ceria dan hth. - Alf
sumber
2
Penembak lurus. +1.
einpoklum
42

Ya, tapi tolong jangan . Sama seperti bahasa Inggris dan Jerman memiliki perintah kata konvensional untuk kata sifat dan kata keterangan (misalnya tempat waktu), begitu juga C dan C ++. Memvariasikan dari pesanan konvensional tidak akan membingungkan kompiler, tetapi akan membingungkan rekan pengembang Anda. Saya akan menyarankan bahwa urutan konvensional kira-kira sepanjang garis

  1. static/ extern(tautan)
  2. const/ volatile(modifikasi)
  3. signed/ unsigned(kesesuaian)
  4. short/ long(panjang)
  5. Tipe dasar (head noun)

meskipun pasti ada beberapa ruang gerak.

hobbs
sumber
29

Apakah "long long" = "long long int" = "long int long" = "int long long"?

Semua jawaban lain di sini berbicara tentang bagian kedua dari pertanyaan Anda. Untuk bagian pertama: Apakah "long long" = "long long int"? , jawabannya adalah ya .

C ++ 11 7.1.6.2 Penentu tipe sederhana (tabel 10)

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

Untuk bagian kedua dari pertanyaan Anda: Apakah "panjang int panjang" = "panjang panjang"? , jawabannya ya lagi.

Tipe-penentu dapat terjadi dalam urutan apa pun dan dapat dicampur dengan penentu deklarasi lainnya. Karena itu, semua hal berikut

long long  
long long int  
long int long  
int long long  

valid dan setara.

haccks
sumber
3
Saya tidak mengerti mengapa Anda tidak meningkatkan @Cheers dan sebagainya. - Sebaliknya jawab Alf.
Sebastian Mach
8
@ saluran; Karena semua jawaban lain hanya mencakup setengah. Semua ditujukan tentang pencampuran format specifier melewatkan bagian pertama dari pertanyaan dalam judul: Apakah "long long" = "long long int" = "long int long" = "int long long"?
pukul
5
@resnel Beberapa orang menjawab untuk insentif mendapatkan perwakilan. Mengedit jawaban orang lain untuk menutupi setengah jawaban yang lain adalah banyak pekerjaan untuk secara efektif memberikan kredit kepada orang lain.
1
Benar. Pada awalnya ini hanya muncul sebagai tambahan kecil. (CC: @Thebluefish)
Sebastian Mach