2011-03-13 1 views
1

나는 조금 주위에 파고했습니다,하지만 난 당신이 내 창자가 말한다

<?php 
    $x=2; 
    if(1<$x<3) { 
    echo "Win!"; 
    } else { 
    echo "Lose!"; 
    } 
?> 

같은 코딩 할 수없는 이유에 간단한 답을 찾을 수가 없어 할 수 PHP는 좌우를 읽기 때문에, 그것을 성명 (1<$x)의 전반부를 평가 한 다음 의미가없는 < 3을 봅니다. 나는 이것이 누군가가 PHP를 조건으로 제공 할 때마다 각각을 분리해야한다는 것을 확인 (또는 반박)하기를 원할 것이다. 이것이 논리 또는 구문 또는 다른 것으로 불릴 지 모르겠다. 그러나 SAS와 같은 다른 문맥에서 이와 같은 표현식을 작성하고 평가 해 볼 수는있다. 그래서 왜 네가 할 수 없는지 이해하고 싶다. PHP. 감사!

+5

*보다 작음 * 연산은 [이진 연산] (http://en.wikipedia.org/wiki/Binary_operation)입니다. – Gumbo

+1

또한 [왜 (0 <5 <3)가 true를 반환합니까?]를 참조하십시오. (http://stackoverflow.com/questions/4089284/why-does-0-5-3-return-true) – BoltClock

+1

@Gumbo : 방법 그것은 PHP와 다른 대부분의 언어로, 어쨌든 정의됩니다. 수학, Lisp과 파이썬은 다르게 생각합니다. – delnan

답변

7

PHP는 1 < $x을 평가 한 다음 그 결과를 3과 비교합니다. 즉, 대괄호를 추가하면 PHP는 ((1 < $x) < 3)으로 간주합니다.

1 < $x이 참이면 비교는 1 < 3이됩니다. false 인 경우 0 < 3입니다. 이것은 유형 변환 (부울에서 정수로) 때문입니다. 둘 다 true로 평가되므로 if 조건은 항상 만족됩니다.

당신은 참이 아닌처럼 작성해야 :

if (1 < $x && $x < 3) 
+0

고마워, 그 말이 맞는 ...하지만 실제로 예제 코드를 사용할 때 Codepad에 오류가 발생합니다. 따라서이 오류는 코드 패드 일 뿐이며 (실제 서버에서는 발생하지 않을 것입니다. 실제 서버에서는 조건이 항상 true로 평가됩니다) ... 또는 PHP가 가상의 조건을 처리하지 못합니다. http : // codepad.org/E1ID4kVw – Amy

+0

@Amy : 들어 본 적이있는 코드 패드의 특질 중 첫 번째는 아니지만 ... – BoltClock

+1

PHP의 원시 파서는 네임 스페이스 분리 기호로'::'를 고려조차 할 수 없으며, * *? – Charles

0

<> 연산자는 부울 값으로 평가한다. 그것은 C에서 이월 된 디자인 선택이었습니다.

관련 문제