2011-01-06 3 views
1

私はCの簡単な質問があります。 この声明は何を意味していますか?if(!someArray [i])

if (!someArray[i]) 

私は演算子を知っています! NOTを意味します。しかし、私はそれの周りに私の頭を得ることができません。 ありがとうございます!

+0

someArrayのタイプは何であるかもしれない長い形でそれを書きますか?ポインタ? – Rup

+0

@John OKですが、それがヌルポインタチェックであれば(私が期待しているように)ポインタ中心の答えを与えることができます。 – Rup

+1

@ジョン:someArrayは、オーバーロードされた演算子を持つオブジェクトの配列にすることができます!、それは問題です。 –

答えて

7

if (!someArray[i])は、someArray[i]がゼロ(またはfalseに変換可能)の場合、ifブロック内のコードが実行されることを意味します。それ以外の場合は実行されません。

someArray[i]がブール値に変換OR someArray[i]タイプは、オペレータ!返すブール値(またはそれに変換可能な値)を定義していない場合ではない場合、あなたのコードはコンパイルされません。

注:すべての数値(int、float、double、charなど)と任意の型のポインタはブール値に変換可能です。

+0

真実ではありません..少なくとも不正確です。 'someArray [i]'はブール値に変換可能である必要はありませんが、 'operator! 'を処理する必要があり、その結果はブール値に変換可能でなければなりません。 – Kos

+0

@Kos:true。同意する。質問者があなたのこのコメントを読むことを願っています。 – Nawaz

+0

@Kos:答えにコメントを組み込むことができます。 –

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]); 
    } 
} 

予想出力は次のようになります

  • 1であるB
  • 2 C
  • 3でありませんチャーを持っていない!
  • 4は、式はので0に評価された場合!(ない)オペレータがtrueを返します電子
1

です:

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 
}; 

そして、同じことが他の二つのベクトルのためにも当てはまります。ちなみに、!演算子は、クラスによってオーバーライドされ、動作を変更することができます。

これは式がboolean型であることが必要ですC#のとは異なることにも注意してください、: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) 

を書くことと等価です言語標準(n1256):

6.5.3.3単項演算perators

制約

1単項 +又は -演算子のオペランドは、算術型を持たなければなりません。 ~演算子の整数型。 !演算子のスカラー型。

セマンティクス
...

5、オペランドの値が0に等しい結果と比較する場合、論理否定演算 !の結果は、オペランドの値が0に等しくない比較した場合、0である1タイプは intです。式 !Eは、 (0==E)に相当します。

KosとJohn Diblingが指摘したように、C++の状況は異なります。最新のC++のドラフト(n1905

5.3.1単項演算子
...
8論理否定演算子のオペランドから!暗黙的に bool(第4節)に変換されます。変換されたオペランドが falseおよび falseである場合、その値は trueです。結果のタイプは boolです。
+1

C++ではクラスオブジェクトと同等ではありません。 – Kos

+0

-1:許容範囲内の回答であるためには、これは間違っています。 –

+0

@Kos:OPはC言語ではなくC言語で明示的に言及しています。 @ John Dibling:§ 6.5.3.3単項演算子¶ 5: "論理否定演算子'! 'の結果は、そのオペランドの値が0と等しくない場合は0、そのオペランドの値が0と等しい場合は1結果は 'int'型です'!E'は '(0 == E)'と等価です。 –

0

おそらく、文if (!someArray[i])の中で知っておくべき重要なことは、演算子の優先順位です。

first [、評価!評価される。

sometype a = someArray[i]; 
if(!a) 
関連する問題