Neden dize::return int karşılaştırmak?
Neden string::compare
short
char
gibi daha küçük bir tip yerine bir int döndürür? Benim anlayışıma göre bu yöntem sadece -1, 0 veya 1 değerini döndürür.
İkinci bölüm, eğer ben tasarım bir karşılaştırma yöntemi karşılaştıran iki nesne tipi Foo
ve ben sadece iade etmek istiyorum -1, 0 veya 1, kullanarak short
char
genellikle iyi bir fikir mi?
EDİT: düzeltilmiş oldum string::compare
-1, 0, döndürmez ya da 1, aslında bir değer ^ verir . 0, &; 0 veya 0 lt. Çizgi adam beni tutmak için teşekkür ederiz.
Göründüğü gibi cevap kabaca, orada hiçbir neden dönmek bir türü daha küçük int çünkü dönüş değerleri vardır "rvalues" ve bu "rvalues" sakın parası olan daha küçük türü tamsayı (4 bayt). Ayrıca, birçok kişi dikkat çekti defterlerin en sistemlerdir muhtemelen olacak boyutu int her neyse, o zamandan beri bu kayıtları olacağız dolu olsun onlara 1, 2 veya 4 bayt değeri yoktur gerçek avantajı dönen daha küçük bir değer.
Hizalama, maskeleme, vb gibi küçük türleri kullanırken ekstra işlem yükü var gibi görünüyor aslında. EDİT 2: Genel kanı küçük veri türleri çok miktarda veri ile çalışırken bir dizi olduğu gibi bellek korumak için var.
Bugün bir şey öğrendim, tekrar teşekkürler çocuklar!
CEVAP
İlk teknik özellikleri de düşük değer döndürecektir.
daha eşit ya da 0, ille -1
1
daha büyük.
İkinci olarak, dönüş değerleri rvalues, ayrılmaz tabi
promosyon, çok küçük bir şey dönen bir anlamı yok.
DÜZENLEME:
Biraz daha bilgi rvalues ile ilgili istek başına ve integral promosyon.
C (C), her ifade ya da bir rvalue ya. lvalue. Tarihsel olarak, şartların lvalues gerçeğine bakın rvalues tek bir atama Sol tarafta görüldüğü sağda görünür. Bugün, basit bir yaklaşım için sınıfı olmayan türleri bir lvalue bellekte bir adresi vardır, bir rvalue yok. Böylece, eğer bir rvalue adresi,al ve cv-elemeleri (hangi durumu "erişim") geçerli değil. İçinde C açısından, sınıf türü yok olan bir rvalue bir saf. değer, bir nesne değil. Dönüş değeri olan bir fonksiyon. başvuru türü olmadığı sürece, rvalue,. (Non-sınıfı türleri olan kasanın içine sığacak neredeyse her zaman bir kayıt döndürülür bellek yerine, örneğin.)
Sınıf türleri için, sorunları biraz daha karmaşık, nedeniyle
bunu aslındaolabilirbir rvalue üye işlevleri çağırmak. Bu
rvalues aslında adresleri, this
için bilgi sahibi olmaları gerekir
işaretçi ve cv nitelikli, cv-yeterlilik beri olabilir
oynuyor aşırı çözünürlükte bir rol. Son olarak, C 11 tanıttı
rvalue başvurular desteklemek amacıyla birçok yeni ayrımlar,;
bu da, sınıf türleri esas olarak geçerlidir.
İntegral promosyon ayrılmaz yazdığında bu gerçeği ifade eder
int
bir ifadede rvalues olarak kullanılan daha küçük,
en kapsamları int
terfi olacak. Çok bile
Bir değişken ifadesi short a, b;
, a b
, a
b
hem ayrıca daha önce int
terfi ilan var
oluşur. Eğer yazarsam aynı şekilde a < 0
, karşılaştırma yapılır
a
, int
dönüştürülmüş değer. Uygulamada, orada
bu fark, en azından üzerinde yapan çok az vaka vardır
2. tamsayı aritmetik sarar makineleri tamamlar (yani
ama çok az bir egzotik, Bugün-ben Çeşitli düşün
anabilgisayar tek istisna sol). Hala, bile
daha yaygın makineler:
short a = 1;
std::cout << sizeof( a ) << std::endl;
std::cout << sizeof( a 0 ) << std::endl;
farklı sonuçlar verecektir: ilk eşdeğerdir
sizeof( short )
ikinci sizeof( int )
(nedeniyle
integral promotion).
Bu iki konu resmen dik; rvalues ve lvalues vardır
integral promosyon ile ilgisi var.Hariç...
integral promosyon sadece rvalues için geçerlidir, ve çoğu (ama
bütün bir rvalue neden olur kullanırsınız durumlardan
integral promosyon. Bu nedenle, gerçekten bir sebep yok
bir şey int
daha küçük sayısal bir değer döndürür.
Hatta çok iyi olarak geri dönmek için bir sebep var
bir karakter yazın. Aşırı yüklü operatörleri, <<
, uslu genellikle gibi
farklı karakter türleri için, bu yüzden sadece geri dönmek istiyorum
karakter tip olarak karakter. (Karşılaştırma yapmalısınız
fark:
char f() { return 'a'; }
std::cout << f() << std::endl; // displays "a"
std::cout << f() 0 << std::endl; // displays "97" on my machine
Fark ikinci durumda, ayrıca olmasıdır
ayrılmaz bir tanıtım farklı sonuçlar ortaya çıkar, neden
<<
aşırı seçilecek.
Neden char[] şifreler için Dize Java t...
Neden[[]]yok[ []] [ []] dize " dön...
Python katılın, neden dize.liste yerin...
Neden't ben bir Dize üzerinde geç...
Neden Matematik yapıyor.yuvarlak(0.499...