私はCの簡単な質問があります。 この声明は何を意味していますか?if(!someArray [i])
if (!someArray[i])
私は演算子を知っています! NOTを意味します。しかし、私はそれの周りに私の頭を得ることができません。 ありがとうございます!
私はCの簡単な質問があります。 この声明は何を意味していますか?if(!someArray [i])
if (!someArray[i])
私は演算子を知っています! NOTを意味します。しかし、私はそれの周りに私の頭を得ることができません。 ありがとうございます!
if (!someArray[i])
は、someArray[i]
がゼロ(またはfalseに変換可能)の場合、if
ブロック内のコードが実行されることを意味します。それ以外の場合は実行されません。
someArray[i]
がブール値に変換OR someArray[i]
のタイプは、オペレータ!
返すブール値(またはそれに変換可能な値)を定義していない場合ではない場合、あなたのコードはコンパイルされません。
注:すべての数値(int、float、double、charなど)と任意の型のポインタはブール値に変換可能です。
つまり、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]);
}
}
予想出力は次のようになります
!
(ない)オペレータがtrue
を返します電子です:
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 */ }
、それは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
です。
C++ではクラスオブジェクトと同等ではありません。 – Kos
-1:許容範囲内の回答であるためには、これは間違っています。 –
@Kos:OPはC言語ではなくC言語で明示的に言及しています。 @ John Dibling:§ 6.5.3.3単項演算子¶ 5: "論理否定演算子'! 'の結果は、そのオペランドの値が0と等しくない場合は0、そのオペランドの値が0と等しい場合は1結果は 'int'型です'!E'は '(0 == E)'と等価です。 –
おそらく、文if (!someArray[i])
の中で知っておくべき重要なことは、演算子の優先順位です。
first [、評価!評価される。
sometype a = someArray[i];
if(!a)
someArrayのタイプは何であるかもしれない長い形でそれを書きますか?ポインタ? – Rup
@John OKですが、それがヌルポインタチェックであれば(私が期待しているように)ポインタ中心の答えを与えることができます。 – Rup
@ジョン:someArrayは、オーバーロードされた演算子を持つオブジェクトの配列にすることができます!、それは問題です。 –