2009-11-21 76 views
1

使用邏輯運算符size_tpid_t類型的正確方法是什麼? 我的意思是:寫下如下所示的內容是合法的嗎?
例如: -如何比較size_t和pid_t與int

size_t sz; 
/* some kind of assignment */ 
if(sz > 0){ 
    /* do something */ 
} 

例如爲:

void f(pid_t pid,...){ 
    if(pid > 0){ 
    /* do something */ 
    } 
    /* ... */ 
} 

..或者我必須做一些投?

編輯
好的答案;
現在,算什麼已被告知,有人可以給我一個理由編碼這樣:

​​

我的老師寫的代碼。
它有道理嗎?
我不知道爲size_t類型保留了多少位(它是依賴於實現的)
但它肯定是一個無符號(你的答案),那麼爲什麼上面的表達式呢?

+0

感謝您的編輯,我試圖正確格式化 – Marco 2009-11-21 15:43:02

回答

6

是的,這是合法的。在進行比較之前,>的兩個參數都將被提升爲匹配類型。

請注意,對於無符號類型,如size_t,> 0表示與!= 0相同。

1

size_tpid_t真的是不同口味的整數值 - 所以是的。

從我的理解,他們背後的整個觀點的確,size_tpid_t的風格可能會因實現,操作系統和體系結構(比如32位v 64位)以及不同而不同。

0

在C中,size_t是一個無符號類型,其大小是INT類型在底層體系結構上的大小。

因爲C是弱類型的,你可以將有符號整數賦值給size_t類型。正確使用類型的責任部分取決於程序員。

在你的情況,因爲你正在比較size_t類型爲零它很好。嘗試將其與負數進行比較。你會感到驚訝。

0

有一個在你只要記住,int值將被隱式轉換爲無符號類型比較一個size_t值與int值沒有問題(因爲size_t是無符號)。

由於上述原因,有些編譯器會在比較中混合使用帶符號和無符號類型時發出警告。在這種情況下,爲了抑制警告,您必須將有符號值顯式轉換爲適當的無符號類型。但是,當有符號值是非負的編譯時常量時,這些編譯器通常不會發出任何警告,這意味着在您的示例中不需要將明確的0轉換爲無符號類型(或使用0U)。