誰でもこの行がどのように機能するか説明してください。
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 番目の部分はあまり意味がありませんが、 の値が返されると思います。a
true
a
b
&
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 番目のオペランドを返します。
したがって、平易な英語で: a
withのビットごとの「and」 3
(2 進数では 11) を取ります。つまり、結果の値は、 の最初の 2 ビットの値に応じて 0、1、2、または 3 のいずれかになりますa
。ゼロでない場合は、その値を返します。それ以外の場合は を返しますc
が、b
評価もされます。
たとえば、a
が 2 の場合、 a & 3
10 & 11 == 10 (1 & 1 == 1 および 0 & 1 == 0 であるため) となり、これは 2 であり、真実です (偽の数は 0 または 0.0 のみです)。それは式全体の戻り値になり、評価さえさb
れc
ません。一方、a
is が 4 の場合はa & 3
100 & 11 == 000 となり、これは誤りであるため、(b, c)
評価され、その結果がc
戻り値になります。