Mam bazę kodów, w której programiści zdecydowali się użyć AND
i OR
zamiast &&
i ||
.
Wiem, że istnieje różnica w pierwszeństwie operatorów ( &&
wcześniej and
), ale przy danym frameworku (a dokładniej PrestaShop ) wyraźnie nie jest to powód.
Jakiej wersji używasz? Czy jest and
bardziej czytelny niż &&
? Czy nie ma różnicy?
~
jest to bitowy operator NOT, a nie logiczny. ;-)Odpowiedzi:
Jeśli użyjesz
AND
iOR
, w końcu potkniesz się o coś takiego:Chcesz zgadnąć, co
$truthiness
jest równe?Jeśli powiedziałeś
false
... bzzzt, przepraszam, źle!$truthiness
powyżej ma wartośćtrue
. Dlaczego?=
ma wyższy priorytet niżand
. Dodanie nawiasów pokazujących ukrytą kolejność czyni to jaśniejszym:Jeśli użyłeś
&&
zamiastand
w pierwszym przykładzie kodu, działałoby to zgodnie z oczekiwaniami i będziefalse
.Jak omówiono w komentarzach poniżej, działa to również w celu uzyskania poprawnej wartości, ponieważ nawiasy mają wyższy priorytet niż
=
:źródło
and
or
raz na zawsze. Widziałem zbyt wielu ludzi myślących, że są dokładnie tacy sami, a odpowiedzi tutaj to więcej referencji.$foo and bar()
, które są ładnymi skrótami do instrukcji if. Jeśli nieoczekiwane zachowanie (z powodu złej dokumentacji lub jej braku czytania) było powodem, aby nie używać czegoś, nie mówilibyśmy w ogóle o korzystaniu z PHP.W zależności od sposobu użytkowania może być konieczne, a nawet przydatne. http://php.net/manual/en/language.operators.logical.php
Ale w większości przypadków wygląda to bardziej na gust programisty, jak każde wystąpienie tego, co widziałem w frameworku CodeIgniter, jak @Sarfraz.
źródło
if ($f = false or true) $f = true;
- wynik byłby taki, że$f
ostatecznie stanie się on prawdą, ponieważ wyrażenie ogólnie ocenia się jako prawdziwe.$f
zostaje przypisane fałsz - ale warunek ma wartość true, a następnie$f
zostaje zastąpiony. Jeśli warunek zostanie oceniony jako fałszywy,$f
nigdy nie zostanie zastąpiony w żaden sposób.and
on&&
, w którymand
działa zgodnie z oczekiwaniami tylko w niektórych sytuacjach i&&
działa zgodnie z oczekiwaniami we wszystkich sytuacje.Dla bezpieczeństwa zawsze porównuję nawiasy i porównuję je. W ten sposób nie muszę polegać na pierwszeństwie operatora:
źródło
Pierwszeństwo różni się pomiędzy && i i (&& ma wyższy priorytet niż i), co powoduje zamieszanie w połączeniu z operatorem trójskładnikowym. Na przykład,
zwróci ciąg , natomiast
zwróci wartość logiczną .
źródło
Ponieważ
and
ma niższy priorytet niż=
można go użyć w przypisaniu warunków:źródło
„&&” oraz „i” są logicznymi operacjami AND i robią to samo, ale priorytet operatorów jest inny.
Priorytet (priorytet) operatora określa, jak „ściśle” wiąże dwa wyrażenia razem. Na przykład w wyrażeniu 1 + 5 * 3 odpowiedź to 16, a nie 18, ponieważ operator mnożenia („*”) ma wyższy priorytet niż operator dodawania („+”).
Mieszanie ich razem w jednej operacji może dać nieoczekiwane rezultaty. W niektórych przypadkach zalecam zawsze używanie &&, ale to twój wybór.
Z drugiej strony „&” jest operacją bitową AND . Służy do oceny i manipulowania konkretnymi bitami w ramach wartości całkowitej.
Przykład, jeśli to zrobisz (14 i 7), wynikiem będzie 6.
źródło
Jeśli standardy kodowania dla konkretnej bazy kodu, w której piszę kod, określają, którego operatora należy użyć, na pewno go użyję. Jeśli nie, a kod określa, które należy użyć (nie często można łatwo obejść), użyję tego. W przeciwnym razie prawdopodobnie
&&
.Czy to dla ciebie bardziej czytelne . Odpowiedź brzmi „ tak” i „nie” w zależności od wielu czynników, w tym kodu wokół operatora i osoby, która go czyta!
Tak. Zobacz operatorów logicznych dla
||
i operatory bitowe dla~
.źródło
Myślę, że to kwestia gustu, chociaż (błędnie) pomieszanie ich może spowodować pewne niepożądane zachowania:
Stąd użycie && i || jest bezpieczniejszy, ponieważ mają najwyższy priorytet. Jeśli chodzi o czytelność, powiedziałbym, że operatorzy ci są wystarczająco uniwersalni.
AKTUALIZACJA : O komentarzach mówiących, że obie operacje zwracają fałsz ... cóż, w rzeczywistości powyższy kod nic nie zwraca, przepraszam za dwuznaczność. Aby wyjaśnić: zachowanie w drugim przypadku zależy od sposobu wykorzystania wyniku operacji. Zwróć uwagę, w jaki sposób odgrywa tutaj pierwszeństwo operatorów:
Powodem
$a === true
jest to, że operator przypisania ma pierwszeństwo przed dowolnym operatorem logicznym, jak już bardzo dobrze wyjaśniono w innych odpowiedziach.źródło
Oto mały licznik:
wynik:
Powiedziałbym, że tego rodzaju literówka jest znacznie bardziej narażona na podstępne problemy (w podobny sposób jak
=
vs==
) i jest znacznie mniej zauważalna niżadn
/ro
literówki, które będą oznaczać błędy składniowe. Znajduję też i / lub jest znacznie łatwiejszy do odczytania. FWIW, większość frameworków PHP, które wyrażają preferencje (większość nie) określa i / lub. Nigdy też nie spotkałem prawdziwej, nieskomplikowanej sprawy, w której miałoby to znaczenie.źródło
Kolejny fajny przykład użycia
if
instrukcji bez=
operacji przypisania.i
ponieważ
AND
ma niższy priorytet, a tym samym||
wyższy priorytet.Różnią się one w przypadkach
true, false, false
itrue, true, false
. Zobacz https://ideone.com/lsqovs w celu uzyskania szczegółowego przykładu.źródło