2011-01-06 64 views
1

我有一個簡單的問題C. 這個說法是什麼意思?if(!someArray [i])

if (!someArray[i]) 

我知道操作員!意味着不是。但我無法理解它。 謝謝!

+0

什麼的的someArray的類型?指針? – Rup 2011-01-06 15:51:31

+0

@John好的,但是如果它是一個空指針檢查(就像我期望的那樣),那麼我們可以給他一個以指針爲中心的答案,這可能對他更有用。 – Rup 2011-01-06 16:20:55

+1

@John:someArray可以是運算符重載的對象數組,所以它很重要。 – 2011-01-06 16:40:38

回答

7

if (!someArray[i])表示如果someArray[i]爲零(或可轉換爲false),則將執行if塊內的代碼,否則將不會執行!

如果someArray[i]是無法轉換爲布爾值,或者如果類型的someArray[i]沒有定義操作!返回布爾值(或可轉換爲它的值),那麼你的代碼將無法編譯。注:所有數字(int,float,double,char等)和任何類型的指針都可以轉換爲布爾值。

1

這意味着如果someArray [i]中的值被解釋爲false(零值或布爾值false),那麼代碼將進入if塊。

假定以下未編譯/未測試的代碼:

//we make an array with some chars, but have one as NULL (0) 
char someArray[] = { 'a', 'b', 'c', 0, 'e' }; 

//we loop through the array using i as the index 
for(int i = 0; i < 5; ++i) 
{ 
    if(!someArray[i]) //if this entry is null (0) or false, show an error: 
    { 
     printf("%d does not have a char!\n", i); 
    } 
    else //otherwise, print the contents 
    { 
     printf("%d is %c\n", i, someArray[i]); 
    } 
} 

預期輸出將是:

  • 0是
  • 1爲b
  • 2爲C
  • 3的確沒有字符!
  • 4爲e
1

!(未)操作者將返回true如果表達式的計算結果爲0,所以:

class SomeObject 
{ 
}; // eo class SomeObject 

std::vector<int> intVector; 
std::vector<long> longVector; 
std::vector<SomeObject*> objectVector; 

intVector.push_back(1); 
intVector.push_back(0); 

longVector.push_back(4049); 
longVector.push_back(0); 

objectVector.push_back(new SomeObject); 
objectVector.push_back(NULL); // or nullptr if you're on C++0x, or even just 0! 


if(!intVector[0]) 
{ 
    // false, intVector[0] is not zero. 
} 

if(!intVector[1]) 
{ 
    // true! intVector[1] is zero 
}; 

而對於其他兩個矢量相同的成立。順便提一下,!運算符可以由類來超越以改變行爲。

還應該注意,這是從C#這要求表達是布爾類型的不同:

int i = 0; 
if(!i) { /* compile error in C# */ } 
if(i == 0) { /* ok in C# */ } 
bool b = false; 
if(!b) { /* ok in C# */ } 
if(!(i == 0)) { /* also ok */ } 
2

在C中,它是等效於寫入

if (someArray[i] == 0) 

從C語言標準(n1256):

6.5.3.3一元算術o perators

約束

1一元 +-操作者的操作數應具有算術類型; ~運算符,整數類型;標量類型的運算符 !

語義
...

5的邏輯否定運算 !的結果是0,如果它的操作數的值不相等的比較爲0,1,如果其操作數的值進行比較等於0。結果有型號 int。表達式 !E相當於 (0==E)

正如Kos和John Dibling指出的那樣,C++的情況是不同的。從最新的C++草案(n1905

5.3.1元運算符
...
8的邏輯否定運算符的操作!隱含轉換爲 bool(第4條);如果轉換後的操作數是 falsefalse,則其值爲 true。結果的類型是 bool
0

或許在聲明if (!someArray[i])中知道的重要事項是運營商的優先權。

第一[評估,然後!被評估。

寫它在一個較長的形式可能是

sometype a = someArray[i]; 
if(!a) 
相關問題