Mantıksal Operatörler, || yada yada?


105

I durumunda olduğu mantıksal operatör açısından bir süre geri okuma unutmayın ORkullanılarak ||daha iyi or(ya da tam tersi).

Bunu projemde bana geri döndüğünde kullanmak zorunda kaldım, ancak hangi operatörün önerildiğini veya hatta doğru olup olmadığını hatırlayamıyorum.

Hangisi daha iyi ve neden?

Yanıtlar:


140

"Daha iyi" yoktur ama daha yaygın olanıdır ||. Farklı önceliğe sahiptirler ve ||normalde bekleneceği gibi çalışırlar.

Ayrıca bakınız: Mantıksal operatörler ( aşağıdaki örnek oradan alınmıştır ):

// 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;

11
ve daha yüksek öncelik nedeniyle değil kısa devre nedeniyle $e = true || $x = 'foo'tanımlamayacaktır $x.
Matt Kieran

1
Kontrol edilen son değeri döndürdükleri diğer birçok dilden farklı olarak , bunların her zaman bir boole değeri döndürdüğünü de belirtmek gerekir . Yani PHP'de (27 || 0) 27 değil, true döndürür .
TextGeek

@TextGeek, "bunlar"? benim için 27 or 0döner 27.
Jānis Elmeris

@ Jānis Elmeris - haklısınız, sadece "||" durum.
TextGeek

2
@TextGeek, aslında orboole döndüren de haklısın . Sadece önceliği o kadar düşük ki bazen başka bir şey yapıyormuş gibi görünüyor . :) print 27 or 0yazdırır 27çünkü sonraor olur . BTW, aldanmaz - çıktı olur . print 27echoecho 27 or 01
Jānis Elmeris

43

Farklı amaçlar için kullanılırlar ve aslında farklı operatör önceliklerine sahiptirler. &&Ve ||buna operatörler, Boole koşulları için tasarlanmıştır andve orkontrol akışı için tasarlanmıştır.

Örneğin, aşağıdaki bir Boole koşuludur:

if ($foo == $bar && $baz != $quxx) {

Bu, kontrol akışından farklıdır:

doSomething() or die();

die()işlev çağrılacak eğer doSomething()dönecekse falseveya null? Ya doSomething()geri gelirse trueya da hiçse?
giannis christofakis

5
doSomething()boole olarak değerlendirilir. PHP'nin doğru olduğunu düşündüğü bir değer döndürürse ( trueboş olmayan bir dizge, vb.), Çağırmaz die().
Matthew Ratzloff

23

Sırasıyla || VEYA ve && ve VE operatör önceliğidir :

$bool = FALSE || TRUE;

  • olarak yorumlandı ($bool = (FALSE || TRUE))
  • değeri $boolISTRUE

$bool = FALSE OR TRUE;

  • olarak yorumlandı (($bool = FALSE) OR TRUE)
  • değeri $boolISFALSE

$bool = TRUE && FALSE;

  • olarak yorumlandı ($bool = (TRUE && FALSE))
  • değeri $boolISFALSE

$bool = TRUE AND FALSE;

  • olarak yorumlandı (($bool = TRUE) AND FALSE)
  • değeri $boolISTRUE

5

Kaynak: http://wallstreetdeveloper.com/php-logical-operators/

Mantıksal işleçlerle çalışmak için örnek kod:

<html>

<head>
    <title>Logical</title>
</head>

<body>
    <?php
        $a = 10;
        $b = 20;
        if ($a>$b)
        {
            echo " A is Greater";
        }
        elseif ($a<$b)
        {
            echo " A is lesser";
        }
        else
        {
             echo "A and B are equal";
        }
    ?>
    <?php
        $c = 30;
        $d = 40;
        //if (($a<$c) AND ($b<$d))
        if (($a<$c) && ($b<$d))
        {
            echo "A and B are larger";
        }
        if (isset($d))
            $d = 100;
        echo $d;
        unset($d);
    ?>
    <?php
        $var1 = 2;
        switch($var1)
        {
            case 1:  echo "var1 is 1";
                     break;
            case 2:  echo "var1 is 2";
                     break;
            case 3:  echo "var1 is 3";
                     break;
            default: echo "var1 is unknown";
        }
    ?>
</body>
</html>

Bağlantı koptu.
Peter Mortensen

2

Bunun eski bir konu olduğunu biliyorum ama yine de. İş yerinde hata ayıkladığım kodda sorunla yeni tanıştım ve belki birisinin benzer bir sorunu olabilir ...

Diyelim ki kod şuna benziyor:

$positions = $this->positions() || [];

$ This-> position () false veya null döndürdüğünde, (örneğin javascript'ten alışkın olduğunuz gibi), $ konumlarının boş dizi olmasını beklersiniz. Ama değil. Değer TRUE veya FALSE olup, $ this-> position () öğesinin döndürdüğüne bağlıdır.

$ This-> position () veya boş dizinin değerini almanız gerekiyorsa, şunu kullanmanız gerekir:

$positions = $this->positions() or [];

DÜZENLE:

Yukarıdaki örnek amaçlandığı gibi değil çalışır ama gerçek olduğunu ||ve oraynı değildir ... Bu deneyin:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

Sonuç şu:

bool(false)
NULL
array(0) {
}

Dolayısıyla, ?:döndürülen değeri veya boş diziyi ayarlamak istediğinizde aslında üçüncü seçenek doğru çözümdür.

$positions = $this->positions() ?: [];

PHP 7.2.1 ile test edildi


bu yanlış cevap, ikinci örnek tam olarak ilk
örnekle

@WayFarer iyi, bu doğru değil (bir sorun var) ama siz de yanılıyorsunuz (|| ve VEYA aynı değil) - düzenlememe bakın
Zdeněk

sağ, operatörler || ve 'veya' farklı önceliğe sahiptir, bu nedenle ikinci örneğiniz şu şekilde çalışır: (($ saniye = returnEmpty ()) veya []); Yani, orijinal sorunun cevabı || daha iyidir, neden 'or' kullanmak istediğinizi gerçekten anlayana kadar her zaman kullanın
WayFarer

1
$positions = $this->positions() ?? [];muhtemelen istediğiniz şeydir.
bishop

0

Birinin doğası gereği diğerinden daha iyi olduğunu düşünmüyorum, ancak buna bağlı kalmanızı öneririm || çünkü çoğu dilde varsayılandır.

DÜZENLEME: Diğerlerinin de belirttiği gibi, ikisi arasında gerçekten bir fark var.


0

Kötü veya daha iyi bir şey yoktur, sadece operatörlerin önceliğine bağlıdır. Daha ||yüksek önceliğe sahip orolduğundan ||, çoğunlukla kullanılır.


-3

Bazı diller kısa devre kullanır ve diğerleri tam Boolean değerlendirmesini kullanır (eğer biliyorsanız, bu $BPascal'daki yönergeye benzer ).

Açıklamalar:

function A(){
    ...Do something..
    return true;
}

function B(){
    ...Do something..
    return true;
}

if ( A() OR B() ) { .....

Bu örnekte, işlev B()asla çalıştırılmayacaktır. Fonksiyon A()TRUE döndürdüğünden, OR ifadesinin sonucu, ifadenin ikinci kısmının değerlendirilmesine gerek kalmadan birinci kısımdan bilinir.

Bununla birlikte ( A() || B() ), ikinci bölüm her zaman birincinin değerine bakılmaksızın değerlendirilir.

Optimize edilmiş programlama için her zaman ORhangisinin daha hızlı olduğunu kullanmalısınız (ilk bölümün geri döndüğü falseve ikinci bölümün gerçekten değerlendirilmesi gerektiği durumlar hariç ).


Bu "En İyi Cevap !!" değil. İyi bir açıklama için lütfen yukarı kaydırın ve en çok oylanan yanıtı alın. İle ||, Bdenilen edilmeyecektir. Her iki operatör de, önceliğin farklı olması dışında tamamen aynı şeyi yapar.
bzeaman

"Her zaman daha hızlı olan OR kullanmalısınız" Hmm, bunun doğru olup olmadığını merak ediyorum ... o halde şunu kontrol edelim: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs İşlem kodlarının sayısı aynı. Yani performans açısından önemli değil.
Jens A. Koch
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.