Toán tử logic, || hoặc HOẶC?


104

Tôi nhớ rằng đã đọc một thời gian về các toán tử logic mà trong trường hợp OR, sử dụng ||tốt hơn or(hoặc ngược lại).

Tôi vừa phải sử dụng điều này trong dự án của mình khi nó quay trở lại với tôi, nhưng tôi không thể nhớ nhà điều hành nào đã được khuyến nghị hoặc liệu nó có đúng hay không.

Đó là tốt hơn và tại sao?

Câu trả lời:


139

Không có "tốt hơn" nhưng một trong những phổ biến hơn là ||. Chúng có mức độ ưu tiên khác nhau và ||sẽ hoạt động như một người thường mong đợi.

Xem thêm: Các toán tử logic ( ví dụ sau được lấy từ đó ):

// 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
$e = true || $x = 'foo'sẽ không xác định $xvì đoản mạch, không phải vì mức độ ưu tiên cao hơn.
Matt Kieran,

1
Cũng cần lưu ý rằng những ngôn ngữ này luôn trả về giá trị boolean, không giống như nhiều ngôn ngữ khác nơi chúng trả về giá trị cuối cùng được kiểm tra. Vì vậy, trong PHP (27 || 0) trả về true , không phải 27 .
TextGeek

@TextGeek, "cái này"? 27 or 0trả lại 27cho tôi.
Jānis Elmeris

@ Jānis Elmeris - bạn nói đúng, lẽ ra tôi chỉ nên nói đến "||" trường hợp.
TextGeek

2
@TextGeek, thực ra, bạn cũng đúng khi ortrả về boolean. Chỉ là mức độ ưu tiên của nó quá thấp nên đôi khi có vẻ như nó làm một việc khác. :) print 27 or 0sẽ in 27orxảy ra sau print 27 . BTW, echokhông bị lừa - echo 27 or 0sẽ xuất ra 1.
Jānis Elmeris

43

Chúng được sử dụng cho các mục đích khác nhau và trên thực tế có các tiền lệ toán tử khác nhau. Các toán tử &&||được dành cho các điều kiện Boolean, trong khi andordành cho dòng điều khiển.

Ví dụ, sau đây là điều kiện Boolean:

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

Điều này khác với luồng điều khiển:

doSomething() or die();

die()hàm sẽ được gọi nếu doSomething()sẽ trả về falsehoặc null? Nếu doSomething()trả lại truehoặc không có gì thì sao?
giannis christofakis

5
doSomething()được đánh giá như một boolean. Nếu nó trả về một giá trị mà PHP coi là true ( true, một chuỗi không rỗng, v.v.), nó sẽ không gọi die().
Matthew Ratzloff

23

Sự khác biệt giữa tương ứng || và OR và && và AND là ưu tiên của toán tử :

$bool = FALSE || TRUE;

  • được dịch là ($bool = (FALSE || TRUE))
  • giá trị của $boolTRUE

$bool = FALSE OR TRUE;

  • được dịch là (($bool = FALSE) OR TRUE)
  • giá trị của $boolFALSE

$bool = TRUE && FALSE;

  • được dịch là ($bool = (TRUE && FALSE))
  • giá trị của $boolFALSE

$bool = TRUE AND FALSE;

  • được dịch là (($bool = TRUE) AND FALSE)
  • giá trị của $boolTRUE

5

Nguồn: http://wallstreetdeveloper.com/php-logical-operators/

Đây là mã mẫu để làm việc với các toán tử logic:

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

Liên kết bị hỏng.
Peter Mortensen

2

Tôi biết đó là một chủ đề cũ nhưng vẫn còn. Tôi vừa gặp sự cố trong mã mà tôi đang gỡ lỗi tại nơi làm việc và có thể ai đó có thể gặp sự cố tương tự ...

Giả sử mã trông như thế này:

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

Bạn sẽ mong đợi (như bạn đã quen với javascript) rằng khi $ this-> Position () trả về false hoặc null, $ position là mảng trống. Nhưng nó không phải. Giá trị TRUE hoặc FALSE phụ thuộc vào giá trị mà $ this-> position () trả về.

Nếu bạn cần nhận giá trị $ this-> position () hoặc mảng trống, bạn phải sử dụng:

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

BIÊN TẬP:

Ví dụ trên không hoạt động như dự định nhưng sự thật là như vậy ||orkhông giống như vậy ... Hãy thử điều này:

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

Đây là kết quả:

bool(false)
NULL
array(0) {
}

Vì vậy, thực sự tùy chọn thứ ba ?:là giải pháp chính xác khi bạn muốn đặt giá trị trả về hoặc mảng trống.

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

Đã thử nghiệm với PHP 7.2.1


đó là câu trả lời không chính xác, ví dụ thứ hai hoạt động chính xác như ví dụ đầu tiên
WayFarer ngày

@WayFarer tốt, đó là không đúng (có một vấn đề) nhưng bạn sai quá (|| và OR là không giống nhau) - xem chỉnh sửa của tôi
Zdeněk

đúng, toán tử || và 'hoặc' có mức độ ưu tiên khác nhau, do đó, ví dụ thứ hai của bạn hoạt động như sau: (($ second = returnEmpty ()) hoặc []); Vì vậy, câu trả lời cho câu hỏi ban đầu sẽ là || là tốt hơn, luôn luôn sử dụng nó, cho đến khi bạn thực sự hiểu tại sao bạn muốn sử dụng 'hoặc'
Wayfarer

1
$positions = $this->positions() ?? [];có thể là những gì bạn muốn.
giám mục

0

Tôi không nghĩ cái này vốn dĩ tốt hơn cái khác, nhưng tôi khuyên bạn nên gắn bó với || bởi vì nó là mặc định trong hầu hết các ngôn ngữ.

CHỈNH SỬA: Như những người khác đã chỉ ra, thực sự có sự khác biệt giữa hai.


0

Không có gì xấu hay tốt hơn, nó chỉ phụ thuộc vào mức độ ưu tiên của các toán tử. Từ khi ||có mức độ ưu tiên cao hơn or, vì vậy ||hầu hết được sử dụng.


-3

Một số ngôn ngữ sử dụng ngắn mạch, và những ngôn ngữ khác sử dụng đánh giá Boolean đầy đủ (nếu bạn biết, điều này tương tự như chỉ thị $Btrong Pascal).

Giải thích:

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

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

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

Trong ví dụ này, hàm B()sẽ không bao giờ được thực thi. Vì hàm A()trả về TRUE, kết quả của câu lệnh OR được biết từ phần đầu tiên mà không cần đánh giá phần thứ hai của biểu thức.

Tuy nhiên ( A() || B() ), phần thứ hai luôn được đánh giá bất kể giá trị của phần đầu tiên.

Để lập trình được tối ưu hóa, bạn nên luôn sử dụng ORcái nào nhanh hơn (ngoại trừ trường hợp khi phần đầu tiên trả về falsevà phần thứ hai thực sự cần được đánh giá).


Đây không phải là 'Câu trả lời hay nhất !!'. Vui lòng cuộn lại và lấy câu trả lời được bình chọn nhiều nhất để có lời giải thích hay. Với ||, Bsẽ không được gọi. Cả hai toán tử đều thực hiện hoàn toàn giống nhau, ngoại trừ mức độ ưu tiên khác nhau.
bzeaman

"bạn nên sử dụng OR cái nào nhanh hơn" Hmm, tôi tự hỏi liệu điều này có đúng không ... vì vậy hãy kiểm tra xem: 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs Số opcodes là tương tự. Vì vậy, nó không quan trọng hiệu suất khôn ngoan.
Jens A. Koch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.