PHP veya operatör davranışları
9 ** operatör davranışını anlamaya çalışıyorum. Lütfen aşağıdaki örneklere bakın:
$e = false || true;
var_dump($e);
Çıkış beklendiği gibi: bool(true);
$f = false or true;
var_dump($f);
Çıkış beklendiği gibi: bool(false)
. =
$f
17 ** atanır yüzden Or
daha yüksek bir önceliğe sahip bir şekilde anladım.
Ama aşağıdaki kodu düşündüğüm oldukça ters çalışır. $foo
5
atanmış sonra bir de kendine göre olacağını düşündüm.
Ama $foo
yalnızca $foo
$foo
bir şey daha önce atanmış olup olmadığını denetliyor demektir ayarlanmışsa, 5 atama atanmış oluyor.
$foo or $foo = 5;
Kimse bunun neden böyle olduğunu açıklayabilir mi?
CEVAP
Temel:
Bir atama ifadesi atanan değer verir.
Bu ne anlama geliyor?
$foo = 'bar'
atama operatörü=
bir değer atar bir ifade. Bir ifade, her zaman bir değer kendisi verir. Sadece ifade gibi1 2
değer3
,$foo = 'bar'
değeri sonuçları ifade'bar'
olur. Bu işler neden:$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
Boolean işlemleri kısa devre işlemleri. Her iki taraf da, eğer gerek olsaydı zaten her zaman değil değerlendirilir.
true || false
sol işlenen bütün ifadetrue
olmalı yani 33 ** olduğundan her zamantrue
genel.false
burada bile değerlendirilmektedir.Operator precedence bir ifadenin parçalarını alt ifadeler şeklinde gruplandırılmış olarak belirler. Yüksek öncelikli operatörler daha düşük öncelikli operatörler önce işlenen gruplandırılır.
Bu nedenle:
$e = false || true;
false || true
değeri sonuçları değerlendirilmektedir, $e
atanan true
,. ||
operatör =
, false || true
bu nedenle bir ifade ($e = false) || true
(karşıt olarak) halinde gruplandırılmış daha yüksek bir önceliğe sahip.
$f = false or true;
Şimdi burada or
vardıraltor
önce atama işlemi bir ifade halinde gruplandırılmış olduğu anlamına gelir =
daha önceliklidir. İlk $f = false
ifadesi sonucu false
değerlendirilir (yukarıda). O zaman bir sonraki değerlendirilir ve true
, sonuçları ama kimsenin umurunda olan 50* *basit ifade var.
Değerlendirme şu şekilde çalışır:
1. $f = false or true;
2. ($f = false) or true; // precedence grouping
3. false or true; // evaluation of left side ($f is now false)
4. true; // result
Şimdi:
$foo or $foo = 5;
Burada,, $foo = 5
daha yüksek bir önceliğe sahip bir ifadesi olarak kabul edilir. or
operatörün sağ tarafında olduğundan, ifade gerekirse tek değerlendirilir. $foo
başlangıçta ne olduğuna bağlı. $foo
true
yan true or ($foo = 5)
60 ** genel olması gerektiğinden hiç değerlendirilmesi, olmayacak sağ el. Eğer $foo
bir falsey değeri başlangıçta rağmen, sağ el tarafı ve değerlendirilir 5
atanan $foo
hangi sonuçları 5
, hangisi gerçek gibi, yani genel ifadesi true
, kimsenin umurunda değil.
1. $foo or $foo = 5;
2. $foo or ($foo = 5); // precedence grouping
3. false or ($foo = 5); // evaluation of left side
4. false or 5; // evaluation of right side ($foo is now 5)
5. true; // result
Oluşturma "mantıksal özel veya&qu...
Mantık Operatör Önceliği SQL: Ve ve Ve...
Raylar üzerinde Ruby / Ruby print_r ve...
Nasıl kullanın VEYA değiştiririm?...
Eğer düzenli ifade dize http:// veya h...