2010-08-05 2 views
7

PHP의 or은 이상한 키워드입니다. 여기 나를 혼란스럽게 만드는 코드 스 니펫이 있습니다 :PHP에서 "or"의 이상한 방법

echo 0 or 1; // prints 1 

$foo = (0 or 1); 
echo $foo; // prints 1 

$foo = 0 or 1; 
echo $foo; // prints 0 for some reason 

왜 마지막 하나는 0이 아닌 1을 인쇄합니까?

+0

사람들은 실제로 두 개의 파이프 대신 "또는"이라는 단어를 쓰나요? – Incognito

+1

예.희귀 기호 (예 : "||")의 조합보다 단어 (예 : "또는")는 사람들에게 더 이해하기 쉽습니다. –

답변

21

연산자 우선 순위가이기 때문입니다. 세 번째 경우에는 할당이 먼저 처리됩니다. 그것은 다음과 같이 해석됩니다 :

($foo = 0) or 1; 

|| 연산자는 다른 우선 순위를 가지고있다. 사용하는 경우

$foo = 0 ||1; 

예상대로 작동합니다.

그것은 ($foo = 0) or 1; 년대 manual on logical operators

+0

'$ foo = (0 or 1);' – Treffynnon

+0

@Trefynnon : 아니요, 또는'='보다 우선 순위가 낮습니다. 만약 당신이'||'를 사용한다면 당신은 맞을 것입니다. – nico

+0

@ Treffynnon : 그러나 그것은 다른 진술 일 것입니다. – You

4

참조하십시오. or=보다 낮은 operator precedence을 갖는다.

이 경우 ||을 사용해야합니다. 우선 순위가 =보다 높으므로 예상대로 평가됩니다.

5

아니, 난,하지 않을 것이라고 때문에 operator precedence의의 :

$foo = 0 or 1; 
// is same as 
($foo = 0) or 1; 
// because or has lower precedence than = 

$foo = 0 || 1; 
// is same as 
$foo = (0 || 1); 
// because || has higher precedence than = 

// where is this useful? here: 
$result = mysql_query() or die(mysql_error()); 
// displays error on failed mysql_query. 
// I don't like it, but it's okay for debugging whilst development. 
0

IIRC, 할당 연산자 (=는) or보다 더 높은 우선 순위를 가지고 있습니다. $foo에 0을 할당하는 문장이지만, 주먹 문으로 해석됩니다 1. 반환

($foo = 0) or 1; 

: 인쇄됩니다 같은

echo(0 or 1); 

따라서, 마지막 줄 것으로 해석된다 1.

0

순서. 단어 "or"는 해당 "||"보다 우선 순위가 훨씬 낮습니다. 할당 연산자보다 낮거나 같습니다. 따라서 할당이 먼저 발생하고 할당 값이 "or"의 첫 번째 피연산자입니다.

"또는"은 논리 연산보다 흐름 제어에 더 많이 사용됩니다. get_something이 false를 반환하도록 코딩되었거나 실패한 경우 0을 나타내는 경우

$x = get_something() or die("Couldn't do it!"); 

과 같이 말할 수 있습니다.

0

처음 두 조각에서 0 또는 1 (본질적으로 참 또는 거짓)을 비교합니다. 세 번째 스 니펫에서는 작동하는 0을 할당하므로 true 또는 false가되므로 조건 또는 조건이 실행되지 않습니다. emphasized text

0

세 번째 예에서 = 연산자는 or보다 우선 순위가 높으므로 먼저 수행됩니다. || 연산자는 표면적으로는 =보다 우선 순위가 높습니다. 당신이 말했듯이, 흥미 롭습니다.