'VE' vs '&&' operatörü olarak


298

Ben geliştiriciler kullanmaya karar bir kod temeli var ANDve ORyerine &&ve ||.

Operatörlerin önceliğinde bir fark olduğunu biliyorum ( &&önce gider and), ancak verilen çerçeve ile ( kesin olarak PrestaShop ) bu açıkça bir neden değildir.

Hangi sürümü kullanıyorsunuz? Mı anddaha okunabilir &&? Yoksa fark yok mu?


1
Bunun ~mantıksal değil, bit bilge DEĞİL operatörü olduğunu unutmayın . ;-)
Gumbo

2
Evet biliyorum. Kötü alışkanlıklar :) . PHP'de 've', 'veya' ve 'xor' olması biraz garip, ama 'hayır' yok, değil mi?
ts.

1
@ts: burada doğru cevap R. Bemrose tarafından verilen yanıttır stackoverflow.com/questions/2803321/and-vs-as-operator/…
Marco Demaio

4
! operatör değil mantıklı
Razor Storm

2
@chiliNUT oldukça doğru. O zaman mantıklı olmalıydı. Görünüşe göre yanlış cevap bu noktada cezalandırıldı :)
doublejosh

Yanıtlar:


664

Eğer kullanıyorsanız ANDve OR, sonunda böyle bir şey kaçırmaktadır edeceğiz:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

Neye $truthinesseşit olduğunu tahmin etmek ister misiniz ?

Eğer falsedediysen ... bzzzt, üzgünüm, yanlış!

$truthinessYukarıdaki değere sahiptir true. Neden? =Bir sahiptir yüksek önceliğe göre and. Örtük düzeni göstermek için parantez eklenmesi bunu daha açık hale getirir:

($truthiness = $this_one) and $that

İlk kod örneğinde kullanmak &&yerine, andbeklendiği gibi çalışacak ve olacak false.

Aşağıdaki yorumlarda tartışıldığı gibi, parantezlerin önceliği daha yüksek olduğundan, bu doğru değeri elde etmek için de çalışır =:

$truthiness = ($this_one and $that)

135
+1: Bu, PHP belgelerinde yüksek ve net bir şekilde yapılmalı veya PHP bu operatörlere veya and orherkes için bir kez DEPRECATE'e değişmeli ve aynı önceliği vermelidir . Çok fazla insanın tamamen aynı şey olduğunu düşündüğünü gördüm ve buradaki cevaplar daha fazla referans.
Marco Demaio

11
Aslında, diğer diller (örneğin, Perl ve Ruby) de aynı öncelik ayrımına sahip bu varyantlara sahiptir, bu nedenle PHP'de önceliği eşitleyerek bu standarttan sapmak (ancak yeni başlayanlar için şaşırtıcı olabilir) mantıklı olmaz. Tonlarca PHP uygulamasının geriye dönük uyumluluğundan bahsetmiyorum bile.
Mladen Jablanović

23
İnsanların bir dilin belgelerini okuyamaması dilin kararlarını yanlış yapmaz. Mladen'in belirttiği gibi, Perl ve Ruby de bu ekstra operatörleri ve aynı öncelikleri kullanırlar. $foo and bar()İf ifadeleri için güzel kısayollar gibi yapılara izin verir . Beklenmedik davranış (kötü belgelerden ya da okumadan) bir şey kullanmamanın bir nedeni olsaydı, PHP'yi kullanmaktan hiç bahsetmezdik.
Altreus

2
Yanlış çizgi bulmak için 3 dakika geçirdim: $ this = true , :( ve ne hakkında $ truthiness = ($ this ve $ that); benim için daha iyi görünüyor :)
Dmitriy Kozmenko

6
Dmitriy ile aynı fikirdeyim - boolean değerlendirmeyi parantez içine almak, kodun amacını netleştirmeye yardımcı olur. Operatörün ve şimdi var oldukları için işlevinin diğer dillerle değerli ve tutarlı olduğunu düşünüyorum, dili anlamak programcının görevidir.
Jon z

43

Nasıl kullanıldığına bağlı olarak, gerekli ve hatta kullanışlı olabilir. http://php.net/manual/en/language.operators.logical.php

// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

Ancak çoğu durumda, @Sarfraz gibi bahsettiğim CodeIgniter çerçevesinde gördüğüm her olay gibi, bir geliştirici tat şeyinden daha fazlası gibi görünüyor.


2
Bu ifade daha büyük bir ifadenin parçasıysa "true" ifadesinin göz ardı edilmediğini belirtmek gerekir. Davayı düşünün if ($f = false or true) $f = true;- sonuç $fsonunda doğru olur, çünkü ifade genel olarak doğru olarak değerlendirilir.
Chris Browne

1
Hayır, daha sonra değişkenin üzerine yazdınız. İfade hala false olarak değerlendirilirse, sonraki satırda true ile üzerine yazmışsınızdır.
r3wt

2
Aslında haklıydı. İlk olarak, $fyanlış atanır - ancak koşul doğru olarak değerlendirilir, bu nedenle $füzerine yazılır. Koşul yanlış $folarak değerlendirilirse, hiçbir şekilde üzerine yazılmaz.
ahouse101

Geliştiricilerin kendi zevklerini takip etmelerini önermek saçma. Aynı kodu, kendisi s / o tercih çünkü yazılı herhangi bir kodda semantik hata yapma olacağını kod yazdım geliştirici korumaya çalışırken başka bir geliştirici kabusu unutmak andüzerinde &&, andeserler sadece bazı durumlar ve beklendiği gibi &&tüm beklendiği gibi eserleri durumlar.
ADTC

13

Güvenlik için, karşılaştırmalarımı her zaman parantez içine alıp boşluk bırakıyorum. Bu şekilde, operatör önceliğine güvenmek zorunda değilim:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

29
Şahsen ben gereksiz gereksiz parantez eklemek sadece ihtiyacınız olandan daha okumak için kafa karıştırıcı yapar düşünüyorum. Örneğin, bunun okunması çok daha kolay olduğunu düşünüyorum: if (($ i == 0 && $ b == 2) || ($ c == 3 && $ f! = 5))
rooby

4
Sanırım bu, bütün gün baktığım en güzel kod parçası. Aferin.
rm-vanda

PHP yorumlanmış bir dil olduğundan, kodunuzda gereksiz boşluklar veya yeni satırlar kullanmazsanız hızlı çalışır. Eğer derlenmiş bir dilde aynısını yaparsanız, derlenmesi daha uzun sürer ancak çalışma zamanında etkili olmaz. Bir kez yapmak bir fark işaret edecek demek istemiyorum ama php + javascript kullanarak tüm uygulamada her ikisi de örnek gibi yazdı ... yükleme süreleri kesin olarak daha büyük olacaktır. Açıklama: Beyaz boşluklar ve yeni satırlar yoksayılır, ancak yok sayılmak için denetlenmeleri gerekir. Bu, yorumlanan şeritlerde çalışma zamanında ve derlenmiş olanları derlerken olur.
JoelBonetR

Php opcache veya benzeri bir şey kullanıyorsanız, yükleme süreleriyle ilgili endişeniz önemsizdir. Umarım kimse onsuz bir üretim php sitesi çalıştırmaz ...
PeloNZ

@PeloNZ kirli yazabilirsiniz, çünkü yine de önbelleğe alınacak ve tüm proje yenilendiğinde yüklenmesi sadece bir saniye sürecek, ha? Temiz kodlama kendiniz ve takım arkadaşlarınız için, zamanlamalarla ilgili olarak, çoğu insanın görmezden geldiği veya basitçe bilmediği bir noktaydı.
JoelBonetR

11

Öncelik , üçlü bir işleçle birleştirildiğinde karışıklığa neden olan && ve ve (&& ve önceliğinden daha yüksek önceliğe sahiptir) arasında farklılık gösterir . Örneğin,

$predA && $predB ? "foo" : "bar"

Bir dönecektir dize oysa

$predA and $predB ? "foo" : "bar"

bir boole döndürecektir .


10

Yana anddüşük önceliğe sahip birden =Eğer durum atamasında kullanabilirsiniz:

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false

2

"Ve" - "&&" - "&" arasındaki farkı açıklayayım.

"&&" ve "ve" her ikisi de mantıksal AND işlemleri ve aynı şeyi yapıyorlar, ancak operatör önceliği farklı.

Bir işlecin önceliği (önceliği), iki ifadeyi nasıl "sıkıca" bağladığını belirtir. Örneğin, 1 + 5 * 3 ifadesinde, çarpma ("*") operatörü toplama ("+") operatörüne göre daha yüksek önceliğe sahip olduğundan, cevap 18 değil, 16'dır.

Bunları tek bir işlemde bir araya getirmek, && her zaman kullanmanızı tavsiye ettiğim bazı durumlarda size beklenmedik sonuçlar verebilir , ancak bu sizin seçiminizdir.


Öte yandan "&" bitsel ve bir işlemdir . Tamsayı değeri içindeki belirli bitlerin değerlendirilmesi ve manipülasyonu için kullanılır.

Örnek (14 ve 7) yaparsanız sonuç 6 olur.

7   = 0111
14  = 1110
------------
    = 0110 == 6

1

hangi sürümü kullanıyorsun

Belirli bir kod temeli için kodlama standartları için kod yazıyorum hangi operatörün kullanılması gerektiğini belirtirse, kesinlikle kullanacağım. Değilse ve kod kullanılması gereken dikte (sık değil, kolayca çalışabilir) o zaman ben bunu kullanacağım. Aksi halde, muhtemelen && .

'Ve' '&&' ifadesinden daha okunabilir mi?

Sizin için daha okunabilir mi ? Cevap evet ve hayır , operatörün etrafındaki kod ve gerçekten okuyan kişi de dahil olmak üzere birçok faktöre bağlı olarak!

|| ~ fark var mı?

Evet. Bkz mantıksal operatörler için ||ve bitsel operatörleri için ~.


0

Sanırım bu bir tat meselesidir, ancak (yanlışlıkla) karıştırmak bazı istenmeyen davranışlara neden olabilir:

true && false || false; // returns false

true and false || false; // returns true

Bu nedenle, && ve || en yüksek önceliğe sahip oldukları için daha güvenlidir. Okunabilirlik açısından, bu operatörlerin yeterince evrensel olduğunu söyleyebilirim.

GÜNCELLEME : Her iki işlemin yanlış döndüğünü söyleyen yorumlar hakkında ... iyi, aslında yukarıdaki kod hiçbir şey döndürmüyor, Belirsizlik için üzgünüm. Açıklığa kavuşturmak için: ikinci durumda davranış, işlem sonucunun nasıl kullanıldığına bağlıdır. Operatörlerin önceliğinin burada nasıl devreye girdiğini gözlemleyin:

var_dump(true and false || false); // bool(false)

$a = true and false || false; var_dump($a); // bool(true)

Bunun nedeni $a === true, atama operatörünün diğer cevaplarda zaten açıklandığı gibi herhangi bir mantıksal operatöre göre önceliğe sahip olmasıdır.


16
Bu doğru değil, hepsi yanlış geri dönüyor.
Jay

0

İşte küçük bir karşı örnek:

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

çıktı:

bool(false)

Bu tür yazım hatalarının sinsi sorunlara ( =vs ile aynı şekilde ==) neden olma olasılığının daha yüksek olduğunu ve sözdizimi hataları olarak işaretlenen adn/ royazım hatalarından çok daha az fark edildiğini söyleyebilirim . Ayrıca okuyorum ve / veya okuması çok daha kolay. FWIW, bir tercih ifade eden çoğu PHP çerçevesi (çoğu belirtmemektedir) ve / veya. Ayrıca, bunun önemli olacağı, asla gerçek olmayan bir davaya da rastlamadım.


0

Atama işlemleri ifolmadan ifadeleri kullanan başka bir güzel örnek =.

if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE

ve

if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE

çünkü ANDdaha düşük bir önceliğe ve dolayısıyla ||daha yüksek bir önceliğe sahiptir.

Bunlar durumlarında farklıdır true, false, falseve true, true, false. Ayrıntılı örnek için https://ideone.com/lsqovs adresine bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.