-1

誰でもこの行がどのように機能するか説明してください。

 a & 3 || (b, c)

最初の部分は次のように翻訳されますか?

 a = a & 3;

それとも 3 進コードで、真の場合 b が返され、そうでない場合は c ですか? ありがとう

4

4 に答える 4

2

最初の部分はビットごとに 3 を使っていると思います。それが真実なら、それを返します。

cそれ以外の場合は、コンマ演算子に基づいて返されます。

if (a & 3 != false)
   return a & 3;
else
   return c;
于 2012-10-30T13:20:05.683 に答える
2

それは三項演算子ではありません。a || b動作方法は、それが評価され、強制された場合aは返され、そうでない場合は評価されて返されます。はビット単位の and です。式の 2 番目の部分はあまり意味がありませんが、 の値が返されると思います。atrueab&c

したがって、意味は次のとおりです。「ビット単位で 3 が 0 でない場合はそれを返し、そうでない場合は c を返します」。その意味では、三項演算子のように動作します...そして変更されaていません。

于 2012-10-30T13:22:09.780 に答える
2

のバイナリ書き込みの最後の 2 ビットのいずれかaが「1」の場合、これは を返しますa&3

逆にa & 3は 0 なので、これは を返します。(b, c)これはcです。

それが何をするのかは明らかですが、その理由は想像できません...

a が正の整数の場合、これは次のように記述できます。

a%4||c

これは、操作の周期的な性質を明確に示しています。

于 2012-10-30T13:22:50.877 に答える
1

(用語に関する注意: では1 + 2、1 と 2 は「オペランド」、+ は「演算子」です)

その式 ( &) の最初の演算子は、ビット単位の「and」です: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators

2 番目の演算子 ( ||) は論理 'or' であり、最初のオペランドが真であれば (ifチェックに合格する場合)、2 番目のオペランドがそうでなければ 2 番目のオペランドを返します。

3 番目 ( ,) はカンマ演算子で、単純に 2 番目のオペランドを返します。

したがって、平易な英語で: awithのビットごとの「and」 3(2 進数では 11) を取ります。つまり、結果の値は、 の最初の 2 ビットの値に応じて 0、1、2、または 3 のいずれかになりますa。ゼロでない場合は、その値を返します。それ以外の場合は を返しますcが、b評価もされます。

たとえば、aが 2 の場合、 a & 310 & 11 == 10 (1 & 1 == 1 および 0 & 1 == 0 であるため) となり、これは 2 であり、真実です (偽の数は 0 または 0.0 のみです)。それは式全体の戻り値になり、評価さえさbcません。一方、ais が 4 の場合はa & 3100 & 11 == 000 となり、これは誤りであるため、(b, c)評価され、その結果がc戻り値になります。

于 2012-10-30T13:20:41.353 に答える