2009-08-13 22 views
8
ulong foo = 0; 
ulong bar = 0UL;//this seems redundant and unnecessary. but I see it a lot. 

Ben de dizilerin ilk elemanının İmzasız belirtmek için neden 'UL' kullanmalıyım?

blah = arr[0UL];//this seems silly since I don't expect the compiler to magically 
       //turn '0' into a signed value 

Birisi boyunca bu imzasız uzun olması özellikle belirtmek için 'UL' neden ihtiyaç için bazı bilgiler verebilir

iyi bir miktar başvuran bu bkz ?

cevap

21
void f(unsigned int x) 
{ 
// 
} 

void f(int x) 
{ 
// 
} 
... 
f(3); // f(int x) 
f(3u); // f(unsigned int x) 

O C++ başka bir aracı olduğu; eğer ihtiyacınız yoksa onu kullanmayın!

4

Normalde buna gereksiniminiz yoktur ve tolere edilebilir herhangi bir editör, işleri düz tutmak için yeterli desteğe sahip olur.

  • parametre tipleri ima edilmektedir (C şablon ++), genel bir yöntem çağırma ve yapmak istiyorum: Ancak, C# ı kullanmak yerleri (ve C++ bu göreceksiniz) vardır emin olun ve bir unsigned long tipi ile arayın. Bu, son zamanlarda da dahil olmak üzere, sık sık olur:
    Tuple<ulong, ulong> = Tuple.Create(someUlongVariable, 0UL);
    Burada UL olmadan Tuple<ulong, int> döndürür ve derleme yapmaz.
  • C# 'da var anahtar sözcüğünü veya C++' ya gelen auto anahtar sözcüğünü kullanarak örtülü değişken bildirimleri. Bu benim için daha az yaygın çünkü çok uzun bildirimleri kısaltmak için sadece var kullanıyorum ve ulong bunun tam tersi.
10

Bazı derleyici sanırım bir uyarı verebilir.
Yazar, kodun uyarı içermediğinden emin olmak için bunu yapıyor olabilir mi?

+1

1 Evet, bu gerçekten her yerde yapılmalıdır derleyici bir uyarı oluşturuyor. – patros

13

Sağladığınız örneklerde buna gerek yoktur. Ancak, sonekler genellikle hassasiyet kaybını önlemek için ifadelerde kullanılır. Örneğin: UL soneki bıraktığı takdirde

unsigned long x = 5UL * ... 

Sen farklı bir cevap alabilirsiniz, sistem 16 bitlik tam sayılar ve 32 bit uzun ürünler olsaydı diyorum. Eğer kapalı sonek sol eğer 16 veya 32 bitlik tamsayılar olsaydı

unsigned long x = 1UL << 17; 

Yine, farklı bir cevap almak istiyorum: Burada

Richard CORDEN yorumlarına esinlenerek başka bir örnektir.

Aynı tür bir sorun 32'ye 64 bit ints ve uzun ve uzun uzun ifadeleri karıştırmak için geçerli olacaktır.Eğer türünü yazmak zorunda hissediyorum

+0

Bu örnekte biraz et yapmalısınız. Bu, üretim kodunda oldukça yaygın bir hata kaynağıdır (16 bit int, 32 bit uzunluğunda): int x = 17; imzasız uzun ul = (1 << x); –

+0

Aşağıda, imzasızlık ile ilgili olan ve türlerin büyüklüğü ile ilgili olmayan bir başka örnek bulunmaktadır: "imzasız uzun ul = ((muhtemelen Negatif +1)> 100)? V1: v2;" Eğer örnekte, olasılıksalValue -2 ise, o zaman ilişkisel operasyonun sonucu yanlıştır. Eğer '1ul' varsa, o zaman '-2' ilk olarak imzasız uzun (ve böylece MAX_ULONG-2 olur) terfi edilir ve ilişkisel işlemin sonucu doğrudur. –

1

sabiti (hatta kesinlikle gerekli değil) emin olun:

  1. her zaman derleyici
  2. Kim hiç bit
  3. içine bu sabit nasıl algılandığı hakkında düşünün That kodunuzun okunması her zaman sabitin nasıl olduğunu düşündüğünüzü ve ne kadar dikkate aldığınızı bilmenizi sağlar (hatta kodu yeniden tararken bile)
  4. Eğer 'U' yazmanız gerekip gerekmediğini düşünürseniz zaman harcamazsınız/'UL' ya da yazmak zorunda değilsiniz

da böyle Misra gibi çeşitli yazılım geliştirme standartları ne olursa olsun (en azından yazma 'U' imzasız ise) diğer bir deyişle

o bazı kadar iyi uygulama tarafından inanılır sabit tipini söz gerektirir sabit türünü yazın çünkü en kötü durumda sadece göz ardı edersiniz ve en iyisi hatalardan kaçınırsınız, farklı derleyicilerin kodunuzu farklı bir şekilde ele almasını ve kod okunabilirliğini geliştirmesini engelleyin

5

Üzgünüm, bunun oldukça eski bir soru olduğunu anlıyorum ama ben C++ 11 kodunda bunu çok kullanıyorum ...

ul, d, f, amaçlanan tür için auto değişkenlerini başlatmak için kullanışlıdır, örn.

auto my_u_long = 0ul; 
auto my_float = 0f; 
auto my_double = 0d; 

Ödeme sayısal değişmezleri üzerinde cpp referansı: http://www.cplusplus.com/doc/tutorial/constants/

+0

Neden otomatik kullanıyorsunuz? – ZuOverture

+0

@ZuOverture Birçok kez sorulan ve cevaplanan buradaki açık cevap, "auto" kodun daha kısa, daha az gereksiz ve yanlışlıkla tamamlanmayan refactoring'e daha az eğilimli hale getirilmesidir. 'Auto' işlevinin kullanılması, sınıf ve aritmetik türlerin normal oluşturulmasının, atamanın operatörünün sağ tarafındaki (en azından) tipini belirtmesi gereken diğer başlangıç ​​biçimleriyle (örneğin," yeni ") daha tutarlı olmasını sağlar. –

+0

otomatik, değişkenin adına ekleme tipi ekleyerek ve belirleyici ile daha da zorlayarak iyi yapmaz, değil mi? Bu anlamsız. Ben sadece yukarıdaki bu örnek kötü olduğunu söylüyorum. – ZuOverture

İlgili konular