논리 연산자, || 또는 또는?


104

의 경우 OR사용하는 ||것이 or(또는 그 반대의 경우도 마찬가지) 낫다는 논리 연산자와 관련하여 오래 전에 읽은 것을 기억 합니다.

제 프로젝트가 돌아 왔을 때 이것을 사용해야 만했지만 어떤 오퍼레이터가 추천되었는지 또는 사실인지 기억이 나지 않습니다.

어느 것이 더 낫고 그 이유는 무엇입니까?

답변:


139

"더 나은"것은 없지만 더 일반적인 것은 ||. 그들은 다른이 우선 순위||하나가 일반적으로 기대하는 것처럼 작동합니다.

참조 : 논리 연산자 ( 다음 예제는 여기에서 가져옴 ) :

// 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'정의하지 않습니다 $x때문이 아니라 더 높은 우선 순위로 인해 단락의.
Matt Kieran 2014

1
또한 마지막으로 확인 된 값을 반환하는 다른 많은 언어와 달리 항상 부울 값을 반환 한다는 점도 주목할 가치가 있습니다 . 따라서 PHP에서는 (27 || 0) 27이 아니라 true를 반환 합니다 .
TextGeek

@TextGeek, "이것들"? 나를 위해 27 or 0돌아온다 27.
Jānis Elmeris

@ Jānis Elmeris-맞습니다. "||"만 언급 했어야합니다. 케이스.
TextGeek

2
@TextGeek, 실제로 or부울 을 반환하는 것이 맞습니다. 우선 순위가 너무 낮아서 가끔 다른 일을하는 것처럼 보입니다 . :) 이후에 발생 하기 때문에 print 27 or 0인쇄 됩니다. BTW 는 속지 않습니다 – 출력 합니다. 27or print 27echoecho 27 or 01
Jānis Elmeris

43

그들은 다른 목적으로 사용되며 실제로 다른 연산자 우선 순위를 갖습니다. &&||반면 연산자는 부울 조건 의도 andor제어 흐름을위한 것이다.

예를 들어 다음은 부울 조건입니다.

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

이것은 제어 흐름과 다릅니다.

doSomething() or die();

die()doSomething()반환 할 경우 함수가 호출 false되거나 null? 만약에 doSomething()반환 true또는 아무것도?
giannis christofakis 2013

5
doSomething()부울로 평가됩니다. PHP가 진실 ( true, 비어 있지 않은 문자열 등)으로 간주하는 값을 반환하면 die().
Matthew Ratzloff 2013

23

각각의 차이 || 및 OR 및 && 및 AND는 연산자 우선 순위입니다 .

$bool = FALSE || TRUE;

  • 로 해석 ($bool = (FALSE || TRUE))
  • $boolISTRUE

$bool = FALSE OR TRUE;

  • 로 해석 (($bool = FALSE) OR TRUE)
  • $boolISFALSE

$bool = TRUE && FALSE;

  • 로 해석 ($bool = (TRUE && FALSE))
  • $boolISFALSE

$bool = TRUE AND FALSE;

  • 로 해석 (($bool = TRUE) AND FALSE)
  • $boolISTRUE

5

출처 : http://wallstreetdeveloper.com/php-logical-operators/

다음은 논리 연산자 작업을위한 샘플 코드입니다.

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

링크가 끊어졌습니다.
Peter Mortensen

2

나는 그것이 오래된 주제라는 것을 알고 있지만 여전히. 나는 직장에서 디버깅하는 코드에서 문제를 만났으며 누군가 비슷한 문제가있을 수 있습니다 ...

코드가 다음과 같다고 가정 해 보겠습니다.

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

$ this-> positions ()가 false 또는 null을 반환 할 때 $ positions는 빈 배열이 될 것입니다. 하지만 그렇지 않습니다. 값은 TRUE 또는 FALSE입니다. $ this-> positions () 반환 값에 따라 다릅니다.

$ this-> positions () 또는 빈 배열의 값을 얻으려면 다음을 사용해야합니다.

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

편집하다:

위의 예는 의도 한대로되지 작업을 수행하지만 진실이다 ||or동일하지 않습니다 ...이 시도 :

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

결과는 다음과 같습니다.

bool(false)
NULL
array(0) {
}

따라서 실제로 세 번째 옵션 ?:은 반환 값 또는 빈 배열을 설정하려는 경우 올바른 솔루션입니다.

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

PHP 7.2.1로 테스트


그것의 잘못된 대답은 두 번째 예는 첫 번째로 정확하게 작동
나그네

잘 @WayFarer, 그것은 (문제가) 올바른 아니지만 당신이있는 거 잘못도 (||와 OR 동일하지 않습니다) - 내 편집을 참조
ZDENEK

맞아, 연산자 || 'or'는 우선 순위가 다르므로 두 번째 예제는 다음과 같이 작동합니다. (($ second = returnEmpty ()) 또는 []); 그래서 원래 질문에 대한 답은 || 당신이 사용 '또는'원하는 왜 당신이 정말 이해가 될 때까지, 항상 그것을 사용하는 것이 좋습니다
나그네

1
$positions = $this->positions() ?? [];당신이 원하는 것입니다.
bishop

0

본질적으로 하나가 다른 것보다 낫다고 생각하지 않지만 계속 고수하는 것이 좋습니다 || 대부분의 언어에서 기본값이기 때문입니다.

편집 : 다른 사람들이 지적했듯이 실제로 둘 사이에는 차이가 있습니다.


0

나쁘거나 더 좋은 것은 없습니다. 연산자의 우선 순위에 달려 있습니다. 이후로는 ||보다 높은 우선 순위를 가지고 or있으므로, ||주로 사용된다.


-3

일부 언어는 단락 회로를 사용하고 다른 언어는 전체 부울 평가를 사용합니다 (알고있는 경우 이것은 $BPascal 의 지시문과 유사합니다 ).

설명 :

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

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

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

이 예에서는 함수 B()가 실행되지 않습니다. 함수 A()가 TRUE를 반환 하기 때문에 OR 문의 결과는 표현식의 두 번째 부분을 평가할 필요없이 첫 번째 부분에서 알 수 있습니다.

그러나를 사용 ( A() || B() )하면 두 번째 부분은 항상 첫 번째 부분의 값에 관계없이 평가됩니다.

최적화 된 프로그래밍을 위해서는 항상 OR더 빠른 것을 사용해야 합니다 (첫 번째 부분이 반환 false되고 두 번째 부분이 실제로 평가되어야 하는 경우 제외 ).


이건 'The Best Answer !!'가 아닙니다. 위로 스크롤하여 좋은 설명을 위해 가장 많이 투표 한 답변을 선택하십시오. 으로 ||, B호출되지 않습니다. 두 연산자는 우선 순위가 다르다는 점을 제외하고 정확히 동일합니다.
bzeaman 2014 년

"항상 더 빠른 OR을 사용해야합니다."음, 이것이 사실인지 궁금합니다 ... 그러니 확인해 봅시다 : 3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs opcode의 수는 같은. 따라서 성능면에서 중요하지 않습니다.
옌스 A. 코흐
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.