4

時々、このようなことをしたいことがあります (i と j は int です)。

(if i==4 && j==9)
{
   ...
}

i が 4 で j が 9 の場合、角かっこを通過します。2 つのアンパサンド (&) の代わりに 1 つのアンパサンド (&) を使用しており、コードをコンパイルして実行しています。

二重アンパサンド && と同じことをしていますか? そうでない場合は、何をしていましたか?

編集:ああ、私は「|」を使用してorで同じことをしてきました 「||」の代わりに

4

4 に答える 4

9

おそらくあなたは意味しif (i==4 && j==9)ます。

このような状況では、これをから&&に変更してもあまり&変更されないはずです。変更される大きな点は、を使用すると、その部分が真である場合にのみ評価されますが、を使用すると、両方が関係なく評価されることです。&&j==9i==4&

のようなものがあるif (x != NULL && x->whatever ...)場合、2番目の部分(逆参照)がnullポインターでないx場合にのみ評価されるようにします。xただし、あなたの場合、intsのように見えるものを比較しても、問題が発生する可能性はほとんどありません。

1シグナル以外の値を生成する可能性のあるものを扱っているときに、問題が発生する可能性もありますtrue==繰り返しになりますが、常にまたはのいずれかが生成さ0れるため、ここでは問題になりません1。(たとえば)から、などを使用してisalphaislowerた場合、それらはゼロ以外の値<ctype.h>を生成するためにのみ必要です。0それらを、と組み合わせると&、ビット単位orで取得され、2つの非ゼロ入力(たとえば、、1 & 2 == 01 && 2 == 1)に対して0が生成される可能性があります。

andからの結果にビット単位で使用すると、 orまたはor==を取得します。降伏します(true)。他のすべては0(false)を生成します---ちょうどそうであるように。0 & 00 & 11 & 01 & 11 & 11&&

于 2012-12-19T02:25:49.230 に答える
5

ビット単位のANDを実行しています。

それがしているのは、式i == 41ifiと同等4であり、RHSでも同じです(jそして9、明らかに)。演算子は、両方の&オペランドがそのビットをオンにしている数値を返します。

(たとえば、1バイトにスリム化された)同じで&&あるため、同じように機能します。00000001 & 000000011つが0(条件がfalse)の場合、は&両方のオペランドに対して2ビットがオンになっていることを認識せず、はfalseです。これはfalseです。000000000

ただし、 1文字短い&などの理由で、単純に使用しないでください。達成したいことを表現しているので使ってください。論理積が必要な場合は、を使用します。&&

同じことがに当てはまりますが|、各オペランドでオンになっている場合は結果のビットの代わりに、いずれかのオペランドでそのビットがオンになっている場合にオンになります。

于 2012-12-19T02:21:08.583 に答える
2

単一のアンパサンドはビット単位のANDを実行します。結果のすべてのビットは、両方のオペランドの位置が1の場合にのみ設定されます。

Cでの比較では、trueの場合は1、falseの場合は0が返されるため、両方のオペランドが比較である限り&、同じ結果が得られます。&&ただし、任意の値の場合、一見ランダムな結果が返されます。 1 && 2はtrueですが1 & 2、1と2のバイナリ表現には共通のビットがないため、falseです。

于 2012-12-19T02:22:20.240 に答える
0

単一のアンパサンドはビット単位およびと呼ばれます。これは、2つの数値をビットごとに'および'する二項演算子です。

たとえば、01100010と00011111の2つの2進数がある場合、ビット単位で結果は00000010になります。

i == 4は、j == 9と同様に、1(true)を返します。したがって、i == 4&j == 9は実際には1&1であり、1(真)と評価されます。

これらの例を試して、違いを確認してください

1)int k = 4&6; vs int k = 4 && 6;

2)if(i == 4 && 2)vs if(i == 4&2)

于 2012-12-19T02:21:33.297 に答える