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

我也看到這個引用數組的第一個元素量好爲什麼或者爲什麼不用'UL'來指定無符號長整型?

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

有人可以提供一些見解,爲什麼我需要「UL」整個指定具體,這是一個unsigned long?

回答

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

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

它是在C語言只是另一種工具++;如果你不需要它,不要使用它!

4

你通常不需要它,任何可以容忍的編輯器都會有足夠的幫助來保持直線。 然而,在C#中我用它的地方(你會在C見這些++):

  • 調用泛型方法(模板,C++),其中,參數是隱含的,你想確定並打電話給unsigned long類型。這種情況經常發生,最近包括這一個:
    Tuple<ulong, ulong> = Tuple.Create(someUlongVariable, 0UL);
    其中沒有UL它返回Tuple<ulong, int>並且不會編譯。
  • 隱式變量聲明在C#中使用關鍵字var,或者在auto關鍵字中使用C++。這對我來說不太常見,因爲我只使用var來縮短非常長的聲明,而ulong則相反。
10

某些編譯器可能會發出警告,我想。
作者可以這樣做,以確保代碼沒有警告?

+1

+1是的,這確實應該在任何地方進行編譯器生成一個警告。 – patros 2009-08-13 18:35:12

13

在您提供的示例中不需要。但後綴通常用於表達式以防止精度損失。例如:

unsigned long x = 5UL * ... 

,如果你離開了UL後綴您可能會得到不同的答案,說,如果你的系統有16位整數和32位多頭。

這裏是由理查德·戈登的言論激發了另一個例子:

unsigned long x = 1UL << 17; 

同樣,你會得到不同的答案,如果你有16位或32位整數,如果你離開了後綴了。

相同類型的問題將適用於32位和64位整數,並在表達式中混合長和長。

+0

你應該充實一下這個例子。這是生產代碼中錯誤的一個相當常見的來源(假設16位int,32位長):int x = 17; unsigned long ul =(1 << x); – 2009-08-14 09:11:34

+0

下面是涉及符號類型和類型的不大小另一個例子:「無符號長UL =((possiblyNegativeValue + 1)> 100)V1:V2;」在例子中,如果possibleNevativeValue是-2,那麼關係操作的結果是錯誤的。如果我們有'1ul',那麼'-2'首先被提升爲unsigned long(因此變成MAX_ULONG-2),並且關係運算的結果爲真。 – 2009-08-14 09:20:56

1

當你覺得有義務寫下來的類型不變(即使不是絕對必要的),你要確保:

  1. ,你總是考慮編譯器將如何把這種恆進位
  2. 有誰讀你的代碼將永遠知道你怎麼想的不斷樣子,您將其考慮在內(即使你,當你重新掃描代碼)
  3. 你不花時間,如果你的想法是否需要寫的「U」 /「UL」或不需要寫

此外,一些軟件開發的標準,如MISRA要求你提的不斷類型無論什麼(至少寫「U」如果無符號)

換句話說

它是由一些好做法,認爲編寫常量的類型,因爲在最壞的情況下,你只是忽略它,並在最好的情況下避免錯誤,避免不同的編譯器會以不同的方式處理代碼並提高代碼的可讀性

5

對不起,我意識到這是一個相當古老的問題,但我用這個有很多在C++ 11碼......

uldf是初始化auto變量的預期型,例如所有有用

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

結帳的數字文本的CPP參考:http://www.cplusplus.com/doc/tutorial/constants/

+0

爲什麼使用auto呢? – ZuOverture 2017-10-06 09:59:53

+0

@ZuOverture這已被要求,並回答了很多次,但這裏的顯而易見的答案是'auto'使代碼更簡潔,少羅嗦,不易發生意外不完整的重構。使用'auto'還可以讓類和算術類型的正常構造與其他形式的初始化(例如'new')更加一致,該初始化必須指定(至少)在賦值運算符右側的類型。 – 2017-11-02 20:20:39

+0

auto不能很好地將類型添加到變量的名稱中,並使用說明符進一步強制它,是不是?沒有用。我只是說這個例子不好。 – ZuOverture 2017-11-03 03:08:40

相關問題