3

1つの三項演算子で複数の変数を設定できるかどうかを調べていました。少しググってみましたが、何も思いつきませんでした。私はいくつかのアイデアをテストし始め、何か近いものを見つけましたが、奇妙な振る舞いもしました。何が起こっているのかについて何かアイデアはありますか?varまた、1回の三項演算で複数設定することは可能ですか?もしそうなら、それを行う適切な方法はありますか?

$i=9;
($i==9)?($w=3|$r=2):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 3 r= 2


$i=9;
($i==9)?($w=4|$r=2):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 6 r= 2


$i=9;
($i==9)?($w=3|$r=7):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 7 r= 7


$i=444;
($i==9)?($w=4|$r=2):($w=7|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 7 r= 1


$i=444;
($i==9)?($w=4|$r=2):($w=1|$r=1);
echo 'w= '.$w.' r= '.$r;//w= 1 r= 1 

ありがとう...


編集:

もう少しテストを行ったところ、これが正しく機能することがわかりました。

    ($i==9)?($w=4 AND $r=7):($w=7 AND $r=1);

ただし、これが正しいかどうかはわかりません。そして、私は最初の例で何が起こっているのか興味があります。

4

4 に答える 4

8

Chadwickが説明したように、論理演算子ANDまたはOR論理演算子を使用しても、希望どおりに機能しません。

$i = 0; $w = 0; $r = 0;
($i==9) ? ($w=4 AND $r=7) : ($w=7 AND $r=1);
echo "w = $w, r = $r\n";
// w = 7, r = 1

$i = 0; $w = 0; $r = 0;
($i==9) ? ($w=0 AND $r=7) : ($w=0 AND $r=1);
echo "w = $w, r = $r\n";
// w = 0, r = 0

ただし、実際に1つのステートメントで複数の割り当てを行いたい場合は、次のlist構成を使用できます。

$i = 0; $w = 0; $r = 0;
($i==9) ?
    (list($w, $r) = array(4, 7)) :
    (list($w, $r) = array(7, 1));
echo "w = $w, r = $r\n";
// w = 7, r = 1

$i = 0; $w = 0; $r = 0;
($i==9) ?
    (list($w, $r) = array(0, 7)) :
    (list($w, $r) = array(0, 1));
echo "w = $w, r = $r\n";
// w = 0, r = 1
于 2010-07-15T21:15:39.197 に答える
3

演算子は、OR三項式内で行っている2番目の割り当てをショートカットしています。したがって、最初の割り当てがゼロ以外と評価された場合、2番目の割り当ては行われません。

ANDステートメント(または)に切り替えると&&、式の2番目の割り当てはまだ最初の割り当てに依存します。最初の割り当てが0(つまりfalse)と評価された場合、ANDの後半は評価されません。最初の値がゼロになることはおそらくまれなので、これはおそらく最初の値よりもデバッグが難しいものです。それは決してそうではないかもしれません、そしてこれは常にうまくいくでしょう...その日まで...

三項演算子はif...else...、複数のステートメントではなく、単一の式の省略形です。複数の独立した割り当てが必要な場合は、標準のif ...else...を使用することを強くお勧めします。

于 2010-07-15T20:59:07.797 に答える
3

現在のコードが動作するように動作する理由を説明してみます。最初に知っておくべきこと:|ビットごとの演算子です。2番目に知っておくべきこと: |オペレーターの優先順位がより高い=ため、最初に実行されます。

それでは、最初のコードを見てみましょう$w=3|$r=2。演算子の優先順位に従って、このコードは次のように記述できます$w=(3|$r=2)。したがって$r、getは正しく設定されてから$w=3|2実行されます。3デュアルシステムでは、で11あり、2です10

  11
| 10
====
  11

したがって、結果は正しいです。

次に、2番目のコードを見てみましょう。

$w=4|$r=2と同じ$w=(4|$r=2)です。$r正しく設定された後、$w=4|2実行されます。デュアルシステムに4あります、です:1002010

  100
| 010
=====
  110

そして110、10進法では6

だから、間違った値が由来していることがわかったので、解決策を見つけましょう:

最初の値が2番目の値に設定された場合、まったく設定されない&&ため、ここでの使用はお勧めしません。0さらに、演算子の優先順位が間違っています:$w=1&&$r=2と同じ$w=(1&&$r=2)です。したがって、常にまたはのいずれか$wが割り当てられます。truefalse

xor考えられる解決策の1つは、演算子を使用することです。この演算子は、両側を実行する必要があり、完全な優先順位を持っています。

$i == 9 ? ($w = 1 xor $r = 2) : ($w = 2 xor $r = 3);

しかし、ご想像のとおり、これは読みにくいので、使用しない方がよいでしょう...

于 2010-07-15T21:27:58.970 に答える
0

OR句を形成するためのパイプ文字がありません:

($i==9)?($w=3|$r=2):($w=7|$r=1);

そのはず:

($i == 9) ? ($w = 3 || $r = 2) : ($w = 7 || $r = 1);

そして、はい、ご覧のとおり、複数の変数が$wあり、$rそこで使用されています。

于 2010-07-15T20:59:11.353 に答える