誰でもこの行がどのように機能するか説明してください。
a & 3 || (b, c)
最初の部分は次のように翻訳されますか?
a = a & 3;
それとも 3 進コードで、真の場合 b が返され、そうでない場合は c ですか? ありがとう
誰でもこの行がどのように機能するか説明してください。
a & 3 || (b, c)
最初の部分は次のように翻訳されますか?
a = a & 3;
それとも 3 進コードで、真の場合 b が返され、そうでない場合は c ですか? ありがとう
最初の部分はビットごとに 3 を使っていると思います。それが真実なら、それを返します。
cそれ以外の場合は、コンマ演算子に基づいて返されます。
if (a & 3 != false)
return a & 3;
else
return c;
それは三項演算子ではありません。a || b動作方法は、それが評価され、強制された場合aは返され、そうでない場合は評価されて返されます。はビット単位の and です。式の 2 番目の部分はあまり意味がありませんが、 の値が返されると思います。atrueab&c
したがって、意味は次のとおりです。「ビット単位で 3 が 0 でない場合はそれを返し、そうでない場合は c を返します」。その意味では、三項演算子のように動作します...そして変更されaていません。
のバイナリ書き込みの最後の 2 ビットのいずれかaが「1」の場合、これは を返しますa&3。
逆にa & 3は 0 なので、これは を返します。(b, c)これはcです。
それが何をするのかは明らかですが、その理由は想像できません...
a が正の整数の場合、これは次のように記述できます。
a%4||c
これは、操作の周期的な性質を明確に示しています。
(用語に関する注意: では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 のみです)。それは式全体の戻り値になり、評価さえさbれcません。一方、ais が 4 の場合はa & 3100 & 11 == 000 となり、これは誤りであるため、(b, c)評価され、その結果がc戻り値になります。