'AND'대 '&&'연산자


298

나는 개발자가 사용하기로 결정 코드베이스가 ANDOR대신 &&||.

나는 연산자의 우선 순위에 차이가 있다는 것을 알고 있지만 ( &&앞에 가야 함 and) 주어진 프레임 워크 ( PrestaShop 이 정확함)를 사용하면 분명히 이유가 아닙니다.

어떤 버전을 사용하고 있습니까? and보다 읽기 쉬운 가요 &&? 아니면 차이가 없습니까?


1
참고 ~비트 현명한 NOT 연산자와 논리가 아닙니다. ;-)
Gumbo

2
예, 알아요 나쁜 습관 :) . PHP에는 'and', 'or'및 'xor'가 있지만 'not'이 없다는 것이 조금 이상하지 않습니까?
ts.

1
@ts : 여기에 정답은 R. Bemrose에서 제공하는 하나입니다 stackoverflow.com/questions/2803321/and-vs-as-operator/...
마르코 Demaio

4
! 논리적 인 비 연산자입니다
Razor Storm

2
@chiliNUT 아주 그렇습니다. 당시에는 이치에 맞았을 것입니다. 숨어있는 잘못된 답변이이 시점에서 처벌 된 것 같습니다 :)
doublejosh

답변:


663

ANDand 를 사용 OR하면 결국 다음과 같은 문제가 발생합니다.

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

무엇이 $truthiness일치 하는지 추측하고 싶 습니까?

당신이 말했다면 false...

$truthiness위의 값이 true있습니다. 왜? =더 높은 우선 순위 이상을 and. 묵시적 순서를 보여주기 위해 괄호를 추가하면 다음이 더 명확 해집니다.

($truthiness = $this_one) and $that

첫 번째 코드 예제 &&대신 대신 사용하면 and예상대로 작동하고입니다 false.

아래 주석에서 논의했듯이 괄호가 다음보다 우선 순위가 높기 때문에 올바른 값을 얻습니다 =.

$truthiness = ($this_one and $that)

135
+1 : PHP 문서에서 명확하고 명확하게해야합니다. 그렇지 않으면 PHP가 이러한 연산자 나 DEPRECATE에 and or대해 우선 순위를 바꾸어 변경해야 합니다. 나는 너무 많은 사람들이 그들이 똑같은 것이라고 생각하고 여기에 대한 답변은 더 많은 평가입니다.
Marco Demaio

11
실제로 다른 언어 (예 : Perl 및 Ruby)에도 우선 순위가 동일한 이러한 변형이 있으므로 PHP에서 우선 순위를 동일하게하여이 표준 (초보자에게는 어려울 수 있음)에서 벗어나는 것이 합리적이지 않습니다. 수많은 PHP 응용 프로그램의 이전 버전과의 호환성은 말할 것도 없습니다.
Mladen Jablanović

23
사람들이 언어 문서를 읽을 수 없다고해서 언어의 결정이 잘못되지는 않습니다. Mladen이 지적한 것처럼 Perl과 Ruby는 이러한 추가 연산자를 동일한 우선 순위로 사용합니다. $foo and bar()if 문에 대한 지름길 인와 같은 구문을 허용 합니다. 예기치 않은 동작 (잘못된 문서에서 읽거나 읽지 않음)으로 인해 PHP 사용에 대해 전혀 이야기하지 않은 것을 사용하지 않는 이유가 있습니다.
Altreus

2
내가 잘못 라인을 찾을 수 3 분 소요 : 이것이 사실 = $ $ truthiness =에 대해 무엇을, :( 및 ($이와 $이) 더 나은 :) 나를 위해 그것의 모양
드미트리 Kozmenko

6
Dmitriy에 동의합니다. 부울 평가를 괄호로 묶으면 코드의 의도를 명확하게하는 데 도움이됩니다. 나는 연산자와 현재 존재하는 기능이 다른 언어와 가치 있고 일관성이 있다고 생각합니다. 언어를 이해하는 것은 프로그래머의 일입니다.
Jon z

43

사용 방법에 따라 필요할 수도 있고 편리 할 수도 있습니다. http://php.net/manual/en/language.operators.logical.php

// "||" has a greater precedence than "or"

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

그러나 대부분의 경우 @Sarfraz와 같은 CodeIgniter 프레임 워크에서 본 모든 발생과 같은 개발자의 취향이 더 많은 것처럼 보입니다.


2
해당 표현이 더 큰 문장의 일부인 경우 "true"는 무시되지 않습니다. 경우를 고려하십시오 if ($f = false or true) $f = true;-결과는 $f전체적으로 참으로 평가되기 때문에 결국 참이됩니다.
Chris Browne

1
아니요, 나중에 변수를 덮어 썼습니다. 표현식이 여전히 false로 평가되면 다음 행에서 true로 덮어 씁니다.
r3wt

2
실제로 그는 옳았습니다. 먼저 $ffalse가 할당되지만 조건이 true로 평가되므로 $f덮어 씁니다. 조건이 거짓으로 평가되면 $f어느 쪽도 덮어 쓰지 않습니다.
ahouse101

개발자가 자신의 취향을 따라야한다고 제안하는 것은 우스운 일입니다. 동일한 코드 자체의가 / 그가 선호하기 때문에 작성된 코드를 의미 실수를 할 것 코드를 작성 개발자 유지하기 위해 노력하고 다른 개발자의 악몽을 잊지 and이상 &&, and작품 일부 상황과 예상대로 &&모두 예상대로 작동 상황.
ADTC

13

안전을 위해, 나는 항상 비교를 괄호로 묶고 비워 둡니다. 그렇게하면 연산자 우선 순위에 의존 할 필요가 없습니다.

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

29
개인적으로 불필요한 불필요한 괄호를 추가하면 필요한 것보다 읽기가 더 혼란 스럽다고 생각합니다. 예를 들어, 나는 이것을 읽는 것이 훨씬 쉽다고 생각한다. if (($ i == 0 && $ b == 2) || ($ c == 3 && $ f! = 5))
rooby

4
나는 이것이 내가 하루 종일 보았던 가장 예쁜 코드라고 생각합니다. 잘 했어.
rm-vanda 2014

PHP는 해석 언어이므로 코드에 불필요한 공백이나 줄 바꿈을 사용하지 않으면 빠르게 실행됩니다. 컴파일 된 언어에서 동일한 작업을 수행하면 컴파일하는 데 시간이 더 걸리지 만 런타임에는 적용되지 않습니다. 한 번 수행하면 차이가 표시되지만 PHP + 자바 스크립트를 사용하는 전체 응용 프로그램에서 예제와 같이 작성되었습니다 ...로드 시간이 더 커질 것입니다. 설명 : 공백과 줄 바꾸기는 무시되지만 무시하려면 확인해야합니다. 해석 된 언어 및 컴파일 된 언어에서 컴파일 할 때 런타임에 발생합니다.
JoelBonetR

@JoelBonetR PHP opcache 또는 이와 유사한 것을 사용하는 경우로드 시간에 대한 걱정은 중요하지 않습니다. 나는 아무도 그것없이 프로덕션 PHP 사이트를 운영하지 않기를 바란다 ...
PeloNZ

@PeloNZ 그래서 당신은 어쨌든 캐시 될 것이고 더 이상 새로 고칠 때 전체 프로젝트를로드하는 데 1 초 더 걸릴 것이므로 더티를 쓸 수 있습니까? 코드 정리는 자신과 팀원을위한 것입니다. 타이밍에 관한 문제는 대부분의 사람들이 무시하거나 단순히 알지 못하는 시점이었습니다.
JoelBonetR

11

우선 순위는 &&and (&&가 and 보다 우선 순위가 높음)에 차이가 있으며, 삼항 연산자와 결합하면 혼동이 발생합니다. 예를 들어

$predA && $predB ? "foo" : "bar"

반면 문자열 을 반환합니다

$predA and $predB ? "foo" : "bar"

부울 을 반환합니다 .


10

조건 할당에 사용할 수있는 and것보다 우선 순위가 낮 으므로=

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false

2

"and"- "&&"- "&"의 차이점을 설명하겠습니다.

"&&"및 "and"는 모두 논리 AND 연산 이며 동일한 작업 을 수행하지만 연산자 우선 순위는 다릅니다.

연산자의 우선 순위 (우선 순위)는 두 표현식을 "단단하게"묶는 방법을 지정합니다. 예를 들어, 식 1 + 5 * 3에서 곱셈 ( "*") 연산자는 더하기 ( "+") 연산자보다 우선 순위가 높기 때문에 답은 18이 아니라 16입니다.

단일 작업으로 함께 혼합하면 항상 && 사용을 권장 하는 경우에 예기치 않은 결과가 발생할 수 있지만, 이것이 귀하의 선택입니다.


반면 "&"는 비트 단위 AND 연산 입니다. 정수 값 내에서 특정 비트의 평가 및 조작에 사용됩니다.

예를 들어 (14 & 7) 결과는 6입니다.

7   = 0111
14  = 1110
------------
    = 0110 == 6

1

어떤 버전을 사용하고 있습니까?

특정 코드베이스에 대한 코딩 표준이 코드를 작성하는 데 사용할 연산자를 지정하는 경우 반드시 사용해야합니다. 그렇지 않은 경우 코드에서 사용해야 할 항목을 지정 하고 (종종 쉽게 해결할 수없는 경우) 사용하겠습니다. 그렇지 않으면 아마도 && .

'&&'보다 'and'가 더 읽기 쉬운가요?

그것은 더 읽기가 당신에게 . 답은 예, 아니오입니다 . 연산자 주변의 코드와 실제로 읽는 사람을 포함한 많은 요소에 따라 다릅니다!

|| ~ 차이가 있습니까?

예. 참조 논리 연산자 에 대한 ||비트 연산자 를 들어 ~.


0

나는 (실수로) 그것들을 섞으면 바람직하지 않은 행동을 일으킬 수 있지만 맛의 문제라고 생각합니다.

true && false || false; // returns false

true and false || false; // returns true

따라서 && 및 || 가장 높은 우선 순위를 갖기 때문에 더 안전합니다. 가독성과 관련하여 이러한 연산자는 보편적이라고 말할 수 있습니다.

업데이트 : 두 작업 모두 false를 반환한다는 의견에 대해 ... 음, 실제로 위의 코드는 아무것도 반환하지 않습니다. 애매한 점으로 인해 죄송합니다. 명확히하기 위해 : 두 번째 경우의 동작은 작업 결과가 어떻게 사용되는지에 달려 있습니다. 운영자의 우선 순위가 여기에서 어떻게 작용하는지 관찰하십시오.

var_dump(true and false || false); // bool(false)

$a = true and false || false; var_dump($a); // bool(true)

그 이유 $a === true는 다른 답변에서 이미 잘 설명했듯이 할당 연산자가 논리 연산자보다 우선하기 때문입니다.


16
이것은 사실이 아니며, 모두 거짓을 반환합니다.
Jay

0

다음은 약간의 반대 예입니다.

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

산출:

bool(false)

나는 오타 이런 종류의 (만큼 같은 방식으로 훨씬 더 가능성이 교활한 문제가 발생하는 것입니다라고 말하고 싶지만 ===)와보다주의 할 훨씬 적은 가능성 adn/ ro구문 오류와 같은 의지 플래그 오타. 나는 또한 읽거나 훨씬 쉽게 읽을 수 있습니다. FWIW, 선호도를 나타내는 대부분의 PHP 프레임 워크는 (대부분은 그렇지 않습니다) 지정 및 / 또는 지정합니다. 또한 문제가되지 않은 실제의 미심쩍은 사건에 처한 적이 없습니다.


0

대입 연산 if없이 명령문을 사용하는 또 다른 좋은 예 =입니다.

if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE

if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE

AND우선 순위가 낮기 때문에 ||우선 순위가 높습니다.

이들의 경우 다른 true, false, falsetrue, true, false. 자세한 예제는 https://ideone.com/lsqovs 를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.