Operator Logis, || atau ATAU?

104

Saya ingat pernah membaca beberapa waktu yang lalu mengenai operator logika yang dalam kasus OR, menggunakan ||lebih baik daripada or(atau sebaliknya).

Saya hanya harus menggunakan ini dalam proyek saya ketika kembali kepada saya, tetapi saya tidak dapat mengingat operator mana yang direkomendasikan atau apakah itu benar.

Mana yang lebih baik dan mengapa?

IniDiucapkan
sumber

Jawaban:

139

Tidak ada yang "lebih baik" tetapi yang lebih umum adalah ||. Mereka memiliki prioritas yang berbeda dan ||akan bekerja seperti yang diharapkan orang secara normal.

Lihat juga: Operator logika ( contoh berikut diambil dari sana ):

// 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;
Felix Kling
sumber
11
dan $e = true || $x = 'foo'tidak akan ditentukan $xkarena korsleting, bukan karena prioritas yang lebih tinggi.
Matt Kieran
1
Perlu juga dicatat bahwa ini selalu mengembalikan nilai boolean, tidak seperti banyak bahasa lain yang mengembalikan nilai terakhir yang dicentang. Jadi di PHP (27 || 0) mengembalikan nilai true , bukan 27 .
TextGeek
@TextGeek, "ini"? 27 or 0kembali 27untukku.
Jānis Elmeris
@ Jānis Elmeris - Anda benar, seharusnya saya hanya mengacu pada "||" kasus.
TextGeek
2
@TextGeek, sebenarnya, Anda benar yang ormengembalikan boolean juga. Hanya prioritasnya yang sangat rendah sehingga terkadang terlihat seperti melakukan sesuatu yang lain. :) print 27 or 0akan mencetak 27karena orterjadi setelahnya print 27 . BTW, echotidak tertipu - echo 27 or 0akan menghasilkan 1.
Jānis Elmeris
43

Mereka digunakan untuk tujuan yang berbeda dan pada kenyataannya memiliki prioritas operator yang berbeda. The &&dan ||operator dimaksudkan untuk kondisi Boolean, sedangkan anddan ordimaksudkan untuk aliran kontrol.

Misalnya, berikut ini adalah kondisi Boolean:

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

Ini berbeda dari aliran kontrol:

doSomething() or die();
Matthew Ratzloff
sumber
die()fungsi akan dipanggil jika doSomething()akan kembali falseatau null? Bagaimana jika doSomething()kembali trueatau tidak sama sekali?
giannis christofakis
5
doSomething()dievaluasi sebagai boolean. Jika mengembalikan nilai yang dianggap benar oleh PHP ( true, string yang tidak kosong, dll.), Ia tidak akan memanggil die().
Matthew Ratzloff
23

Perbedaan masing-masing || dan OR dan && dan AND adalah prioritas operator :

$bool = FALSE || TRUE;

  • ditafsirkan sebagai ($bool = (FALSE || TRUE))
  • nilai $booladalahTRUE

$bool = FALSE OR TRUE;

  • ditafsirkan sebagai (($bool = FALSE) OR TRUE)
  • nilai $booladalahFALSE

$bool = TRUE && FALSE;

  • ditafsirkan sebagai ($bool = (TRUE && FALSE))
  • nilai $booladalahFALSE

$bool = TRUE AND FALSE;

  • ditafsirkan sebagai (($bool = TRUE) AND FALSE)
  • nilai $booladalahTRUE
John Slegers
sumber
5

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

Berikut ini contoh kode untuk bekerja dengan operator logika:

<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>
improgrammer
sumber
Tautannya rusak.
Peter Mortensen
2

Saya tahu itu topik lama tapi tetap saja. Saya baru saja menemui masalah dalam kode yang saya debug di tempat kerja dan mungkin seseorang mungkin memiliki masalah serupa ...

Misalkan kodenya terlihat seperti ini:

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

Anda akan mengharapkan (seperti yang biasa Anda gunakan dari mis. Javascript) bahwa ketika $ this-> position () mengembalikan false atau null, $ position adalah array kosong. Tapi ternyata tidak. Nilainya TRUE atau FALSE tergantung pada apa yang dikembalikan $ this-> position ().

Jika Anda perlu mendapatkan nilai $ this-> position () atau array kosong, Anda harus menggunakan:

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

EDIT:

Contoh di atas tidak berfungsi sebagaimana mestinya tetapi kenyataannya itu ||dan ortidak sama ... Coba ini:

<?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";

Inilah hasilnya:

bool(false)
NULL
array(0) {
}

Jadi, sebenarnya opsi ketiga ?:adalah solusi yang tepat ketika Anda ingin mengatur nilai yang dikembalikan atau array kosong.

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

Diuji dengan PHP 7.2.1

Zdeněk
sumber
itu jawaban yang salah, contoh kedua berfungsi persis seperti yang pertama
WayFarer
@WayFarer baik, itu tidak benar (ada masalah) tetapi Anda juga salah (|| dan ATAU tidak sama) - lihat suntingan saya
Zdeněk
benar, operator || dan 'atau' memiliki prioritas berbeda, jadi, contoh kedua Anda berfungsi sebagai: (($ second = returnEmpty ()) atau []); Jadi, jawaban dari pertanyaan awal adalah || lebih baik, selalu gunakan, sampai Anda benar-benar mengerti mengapa Anda ingin menggunakan 'atau'
WayFarer
1
$positions = $this->positions() ?? [];mungkin yang Anda inginkan.
uskup
0

Menurutku tidak ada yang secara inheren lebih baik dari yang lain, tapi aku sarankan untuk tetap menggunakan || karena ini adalah default di sebagian besar bahasa.

EDIT: Seperti yang ditunjukkan orang lain memang ada perbedaan antara keduanya.

exahex
sumber
0

Tidak ada yang buruk atau lebih baik, Itu hanya tergantung pada prioritas operator. Karena ||memiliki prioritas yang lebih tinggi daripada or, sehingga ||banyak digunakan.

Nishu Tayal
sumber
-3

Beberapa bahasa menggunakan sirkuit pendek, dan yang lain menggunakan evaluasi Boolean penuh (jika Anda tahu, ini mirip dengan arahan $Bdi Pascal).

Penjelasan:

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

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

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

Dalam contoh ini, fungsi B()tidak akan pernah dijalankan. Karena fungsi A()mengembalikan TRUE, hasil pernyataan OR diketahui dari bagian pertama tanpa perlu mengevaluasi bagian kedua dari ekspresi.

Namun dengan ( A() || B() ), bagian kedua selalu dievaluasi terlepas dari nilai bagian pertama.

Untuk pemrograman yang dioptimalkan, Anda harus selalu menggunakan ORmana yang lebih cepat (kecuali untuk kasus ketika bagian pertama kembali falsedan bagian kedua benar-benar perlu dievaluasi).

janhsh
sumber
Ini bukan 'Jawaban Terbaik !!'. Gulir kembali ke atas dan pilih jawaban yang dipilih paling banyak untuk penjelasan yang baik. Dengan ||, Btidak akan dipanggil. Kedua operator melakukan hal yang persis sama, hanya saja prioritasnya berbeda.
bzeaman
"Anda harus selalu menggunakan ATAU yang lebih cepat" Hmm, saya ingin tahu apakah ini benar ... jadi mari kita periksa: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs Jumlah opcode adalah sama. Jadi tidak masalah performa.
Jens A. Koch