簡體   English   中英

是否可以使用一個三元運算符設置多個變量?

[英]Is it possible to set multiple variables with one ternary operator?

我想看看是否可以用一個三元運算符設置多個變量。 我有點谷歌了,但沒有拿出任何東西。 我開始測試一些想法,發現了一些接近 - 但也有一些奇怪的行為; 關於發生了什么的任何想法? 並且,是否可以在單個三元運算中設置多個var 如果是這樣,有沒有正確的方法呢?

$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);

但是,我不確定這是否正確。 我很好奇第一個例子中發生了什么。

正如Chadwick所解釋的那樣,使用ANDOR邏輯運算符將無法按照您希望的方式運行:

$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

但是,如果您確實想在一個語句中進行多個賦值,則可以使用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

OR運算符正在快速執行您在三元組表達式中所做的第二個賦值。 因此,如果第一個求值為非零,則不會進行第二個賦值。

如果切換到AND語句(或&& ),表達式中的第二個賦值仍依賴於第一個賦值:如果第一個求值為0 (即false),則不計算AND的后半部分。 調試可能比第一個更困難,因為第一個值可能很少為零。 它可能永遠不會,這將永遠有效......直到有一天......

三元運算符只是if...else...簡寫,只有單個表達式而不是多個語句。 如果你想要多個獨立作業,我強烈推薦使用標准if ... else ...更容易閱讀。

我將嘗試解釋為什么您當前的代碼表現得像它的行為。 首先要知道: | 是按位運算符。 第二件事要知道: | 具有比=更高的運算符優先級,因此首先執行。

那么,讓我們來看看第一個代碼: $w=3|$r=2 根據運算符優先級,此代碼可以這樣編寫: $w=(3|$r=2) 所以$r得到正確設置然后執行$w=3|2 3在雙系統11210

  11
| 10
====
  11

所以結果是正確的。

現在,讓我們看看第二個代碼:

$w=4|$r=2$w=(4|$r=2) $r設置正確,然后執行$w=4|2 4100在雙系統, 2010

  100
| 010
=====
  110

十進制中的1106

那么,現在您知道錯誤的值來自,現在讓我們找到一個解決方案:

不鼓勵使用&& ,因為如果第一個值設置為0則根本不會設置第二個值。 此外,它有錯誤的運算符優先級: $w=1&&$r=2$w=(1&&$r=2) 所以$w總是被賦值為truefalse

一種可能的解決方案是使用xor運算符。 此運算符需要執行雙方並且它具有完美的優先級:

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

但是,你可以想象,這很難讀,所以最好不要使用它......

您缺少一個管道字符來形成OR子句:

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

它應該是:

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

是的,可以看出你在那里使用了多個變量$w$r

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM