“Long long” = “long long int” = “long int long” = “int long long” mu?


153

Her ikisini de buldum long int longve int long longbir değişken türü için derleyebilir. Arasında herhangi bir fark var mı long int long, int long long, long longve long long int?

Genel olarak, tip aynı sayıda ise aynı longmıdır?

1 uzun:

long l;
int long il;
long int li;

2 uzun:

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

Ayrıca yukarıdakiler doğruysa, aşağıdaki beyanlar da aynı mıdır?

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

8
Bunu kullanarak (yalnızca derleyicinizde de olsa) test edin std::swap. Türler aynı değilse bu derlenmeyecektir.
Bathsheba


24
Oy verildi reopen. Sözde yinelenen ilgili ancak bu soru değil. Oradaki cevap bu soruya cevap vermiyor. Yakın seçmenler: lütfen cehalet temelinde kapatmak için oy vermeyin.
Şerefe ve s. - Alf


Emin olmak için her birini sizeof () ile karşılaştırın. Uzun bir uzunluk 64 bit olmalıdır, bu nedenle sizeof (l) 8 olmalıdır, sizeof (ill) == sizeof (lil) ise derleyiciniz bunları aynı görür. Bu, mevcut derleyiciniz ve karşılaşabileceğiniz gelecekteki derleyiciler için geçerli olacaktır (umarım asla olmayacak veya sizeof yapmak için ciddi miktarda yeniden yazma yaptım).
Michael Stimson

Yanıtlar:


136

C ++ Standardına göre (7.1.6.2 Basit tip belirticiler)

3 Birden çok basit tip belirtecine izin verildiğinde, bunlar herhangi bir sırayla diğer çıkartma belirteçleriyle serbestçe karıştırılabilir.

Örneğin aşağıdaki beyan geçerlidir

long static long const int x = 10;

constexprNiteleyiciyle birlikte belirteci bile kullanabilirsiniz const. Örneğin

constexpr long static long const int x = 10;

Bu arada, belirteçleri unuttuk signed! Örneğin bildiriciden önce ekleyelimx

constexpr long static long const int signed x = 10;

C de aynı deklare edici belirteç sırasında birkaç tür niteleyici kullanabilirsiniz. C Standardına göre (6.7.3 Tip niteleyicileri)

5 Aynı niteleyici, aynı belirteç-niteleyici listesinde birden çok kez doğrudan veya bir veya daha fazla typedef ile görünürse, davranış yalnızca bir kez göründüğü gibidir.

Örneğin C'de aşağıdaki beyan da geçerlidir

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

Dolayısıyla, programda yazılan sembol sayısına göre ödeme alırsanız, bu tür bildirimleri kullanmanızı tavsiye ederim. :)


96
Kesinlikle, değerin asla değişmeyeceğinden emin olmak zorundasınız.
Bob

3
@hvd Maalesef yorumlar genellikle bu hesaplamadan hariç tutulur.
Vlad from Moscow

9
Gibi yazılmış olsa bile #define REM(...)büyük bir kelime sayısının bir örnek için, sonra ve, 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
Elemeleri karıştırmak bile zorunda değilsiniz ... 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 :-) iyi derler derler
Lucas Trzesniewski

111

Tip aynı mı?

Evet.

C ++ 11 §7.1.6.2 / 3

Birden çok basit tip belirtecine izin verildiğinde, diğer çıkartma belirteçleriyle herhangi bir sırayla serbestçe karıştırılabilirler .


2
Düz atıcı. +1.
einpoklum

42

Evet, ama lütfen yapma . İngilizce ve Almanca'nın sıfatlar ve zarflar (örneğin, zaman - yer) gibi geleneksel kelime düzenleri olduğu gibi, C ve C ++ da öyle. Geleneksel siparişten farklı olarak derleyiciyi karıştırmaz, ancak diğer geliştiricilerinizi karıştırır. Geleneksel düzenin kabaca

  1. static/ extern(bağlantı)
  2. const/ volatile(değişiklik)
  3. signed/ unsigned(imza)
  4. short/ long(uzunluk)
  5. Temel tür (kafa adı)

rağmen kesinlikle bazı kıpır kıpır oda.


29

“Long long” = “long long int” = “long int long” = “int long long” mu?

Buradaki diğer tüm cevaplar sorunuzun ikinci kısmı hakkında konuştu. İlk bölüm için: “long long” = “long long int”? , cevap evet .

C ++ 11 7.1.6.2 Basit tür belirticiler (tablo 10)

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

Sorunuzun ikinci kısmı için: “long int long” = “int long long” mu? , cevap yine evet.

Tür belirteçleri herhangi bir sırada olabilir ve diğer bildirim belirteçleriyle karıştırılabilir . Bu nedenle, aşağıdakilerin tümü

long long  
long long int  
long int long  
int long long  

geçerli ve eşdeğerdir.


3
@Cheers ve hth'yi neden geliştirmediğinizi anlamıyorum. - Alf cevap versin.
Sebastian Mach

8
@phresnel; Çünkü diğer tüm cevaplar sadece yarısını kapsar. Tümü, başlığında sorunun ilk yarısında eksik olan biçim belirticinin birbirine karışmasıyla ilgili: “uzun uzun” = “uzun uzun int” = “uzun int uzun” = “int uzun uzun” mu?
haccks

5
@phresnel Bazı insanlar temsilcilik kazanma teşviki için cevap verirler. Bir başkasının cevabını diğer yarıyı kapsayacak şekilde düzenlemek, başkasına etkili bir şekilde kredi vermek için çok iştir.

1
Doğru. İlk başta bu sadece küçük bir ek olarak ortaya çıktı. (CC: @Thebluefish)
Sebastian Mach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.