$a + + + $a가 == 2인 이유는 무엇입니까?
시도할 경우:
$a = 0;
echo $a + ++$a, PHP_EOL;
echo $a;
다음과 같은 출력이 표시됩니다.
2
1
데모: http://codepad.org/ncVuJtJu
왜 그런 것일까요?
다음과 같은 결과가 나올 것으로 예상됩니다.
1
1
제가 이해한 바로는:
$a = 0; // a === 0
echo $a + ++$a, PHP_EOL; // (0) + (0+1) === 1
echo $a; // a === 1
그런데 왜 그것은 출력이 아닌가요?
왜 1이 아니라 2를 얻었는지 설명하는 모든 답은 사실 틀렸습니다.설명서에 , PHP 문에따, 은합혼을 혼합하는 것.+
그리고.++
되지 않은 동작이기 수 .다른 버전의 PHP로 전환하면 결과가 변경될 수 있으며, 결과도 마찬가지로 유효합니다.
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
주의:
측정 시스템 우선 순위는 평가 순서를 결정하지 않습니다.연산자 우선 순위는 식이 다음과 같이 결정됩니다.
$l + ++$l
는 로해됩니다로 됩니다.$l + (++$l)
하지만 왼쪽 피연산자인지 오른쪽 피연산자인지는 결정하지 않습니다.+
연산자가 먼저 평가됩니다.왼쪽 피연산자를 먼저 평가하면 결과가 0+1이 되고 오른쪽 피연산자를 먼저 평가하면 결과가 1+1이 됩니다.측정 시스템 연관성도 평가 순서를 결정하지 않습니다.그것은
+
연산자의 연관성은 다음과 같이 결정됩니다.$a+$b+$c
는 평가를 받습니다.($a+$b)+$c
단일 연산자의 피연산자가 평가되는 순서는 결정되지 않습니다.
관련성:정의되지 않은 결과를 가진 다른 식에 대한 버그 보고서에 대해 PHP 개발자는 다음과 같이 말합니다. "C가 보증하지 않는 것처럼 [...] 평가 순서에 대해 보장하지 않습니다.문서에서 첫 번째 피연산자가 먼저 평가된다고 명시된 곳을 가리켜 주시겠습니까?"
사전 증분 연산자 "+"는 평가되는 나머지 식 앞에 발생합니다.그래서 실제로는 다음과 같습니다.
echo $l + ++$l; // (1) + (0+1) === 2
a + b
a = 1
b = ++a
:= 2
당신은 왜 다른 것을 기대합니까?
PHP에서:
$a = 0;
$c = $a + ++$a;
$c = ($a) + (++$a);
시각화된 평가 시퀀스:
$a = 0; ($a = 0)
$a = 1; (++$a)
$c = $a + $a (1 + 1);
또는 다음과 같이 기록됩니다.
Sum 연 수 는 순 간 되 행 산 이$a
1다니 때문에 이미 입니다. 냐하면왜++$a
이미 평가가 완료되었습니다.++
는 산자는이평가다니됩에전다음 됩니다.+
교환입니다.
재미로:
$a++ + ++$a
결과도 2개야.그러나 식으로 비교하면 다음과 같지 않습니다.
$a++ + ++$a == $a + ++$a
반면에.
$a++ + ++$a == $a-- + --$a
는 "유효"입니다.
참고 항목:
- PHP의 평가 순서 (2013년 9월, 니키C에 의한) (경유로)
PHP 블로그 게시물에 있는 나의 평가 순서는 이것을 자세히 설명하지만, 여기에 기본 아이디어가 있습니다.
- 연산자 우선 순위 및 연관성은 평가 순서와 관련이 없습니다.
- PHP는 평가 순서를 보장하지 않습니다.PHP 버전 간에 예고 없이 순서가 변경될 수 있으며 주변 코드에 따라 순서가 다를 수도 있습니다.
- "는 ": "단순한" PHP, "단순한" PHP)에 대한 액세스를 제외하고
$a
) 단순 변수에 대한 액세스는 실제 식이 발생하는 순서에 관계없이 더 복잡한 식 이후에 실행됩니다. - 이 특별한 경우에 그것은 의미합니다.
++$a
복잡한 식이기 때문에 먼저 실행되고 다음 값만 실행됩니다.$a
이(이 시점에서 이미 1임)됩니다.그래서 당신은 효과적으로 요약하고 있습니다.1 + 1 = 2
. - 복잡한 식 후에 단순 변수를 가져오는 이유는 컴파일된 변수(CV) 최적화 때문입니다.를 들어 이 하지 않도록 에는 " " " " 를 사용합니다.
@
오류 억제 연산자. 단순 변수 가져오기를 포함하여 모든 식이 왼쪽에서 오른쪽으로 평가됩니다. - 이 특별한 경우에 그것은 의미합니다.
@($a + ++$a)
으로 결적으로가 될 입니다.1
첫번째로 냐하첫째로면왜.$a
는 페치되고(그 때는 0) 그 이후에만 증분됩니다.
++
우선 순위가 높은 연산자이므로 먼저 적용됩니다.
그래서 지금l = 1.
그렇게1 + 1 = 2.
++$l(프리 인크리먼트)을 수행하면 추가하기 전에 수행됩니다. -> 연산자 우선 순위를 확인하십시오.
그서의 값, 그가는의 값.$l
▁▁be 될 것입니다.1
에 : 하기전가:
echo $l + ++$l; // $l => 1 because ++$l is done first
그래서 여러분의 대답은 2가 될 것입니다.
하지만 당신이 그럴 때:
echo $l // you will get your first value which is $l => 1
그래서 여러분의 답은 1이 될 것입니다.
이 동작은 PHP가 스크립트를 컴파일하는 방법을 검사하여 확인할 수 있습니다. 예:
$a = 0;
echo $a + ++$a;
다음 작업 코드로 컴파일한 다음 실행됩니다.
compiled vars: !0 = $a
line # * op fetch ext return operands
---------------------------------------------------------------------------------
1 0 > ASSIGN !0, 0
1 PRE_INC $1 !0
2 ADD ~2 !0, $1
3 ECHO ~2
4 > RETURN null
이는 다음과 같은 스크립트로 변환됩니다.
$a = 0; // ASSIGN
$tmp = ++$a; // PRE_INC
echo $a + $tmp; // ADD, ECHO
결론
.$a
의 왼손 표현으로 평가됩니다.$a + (++$a)
그것은 이미 증가했습니다,++$a
먼저 평가되었습니다.
분명히, 이 행동은 의존해서는 안 됩니다; 그 문제에 대해 어떤 언어로도.
증분 조작자 설명서를 확인합니다.
http://www.php.net/manual/en/language.operators.increment.php
또는 다음 코드패드를 참조하십시오. http://codepad.org/Y3CnhiLx
<?php
$n = 0;
$m = 0;
echo '++ before:';
echo $n+ ++$n;
echo PHP_EOL;
echo '++ after:';
echo $m+ $m++;
echo PHP_EOL;
echo 'n:'.$n;
echo PHP_EOL;
echo 'm:'.$m;
출력:
++ before:2
++ after:1
n:1
m:1
두 개의 증분 연산자가 있습니다. 하나는 사전 증분 연산자이고 두 번째는 사후 증분 연산자입니다.사전 증분은 식을 사용하기 전에 정수 값을 증가시키는 반면, 사후 증분은 식을 사용한 후 숫자 값을 증가시킵니다.
아래와 같이 변수 $a와 변수 $b가 있다고 가정합니다.
$a=0;
$b=++$a는 b=1의 값을 제공합니다.
하는 동안에
$b=$a++는 b=0 값을 제공합니다.
코드의 출력은 여기 보이는 것처럼 PHP 버전에 따라 다릅니다.
-.3.0 - 5.0.5에 입니다.
1
1
경우에는 의 .+
연산자가 먼저 평가됩니다(0, 1, +).
- alpha45.1.0 - 5.5.0 alpha4에 입니다.
2
1
경우에는 의 오른쪽에+
연산자가 먼저 평가됩니다(1, 1, +).
이는 PHP에서 하위 표현식의 평가 순서에 대한 보장이 없다는 interjay의 답변에 따른 것입니다.출력이 다음과 같을 수 있다는 가정 1, 1
맞습니다. 출력이 다음과 같을 수 있다고 주장하는 답변도 그렇습니다. 1, 2
.
번째 은 첫번분명부분은한째▁is▁that입니다.++
보다 우선 순위가 .+
.
두 번째 부분은 php 엔진이 첫 번째 피연산자의 값을 다른 익명 변수에 저장하지 않는다는 것입니다. 그래서$l + ++$l
않에다니습에 .
$a = $l;
$b = ++$l;
return $a + $b;
앞에서 언급했듯이 x++와 ++x에는 차이가 있습니다.당신은 그것을 다음과 같이 해석할 수 있습니다.
x++;
세미콜론 뒤의 증분
그리고.
++x;
그 표현식의 평가에 있어서의 증가.
그래서 당신의 표현은 오른쪽에서 왼쪽으로 평가되는 것 같습니다.
echo $l + ++$l;
- $l 가져오기: $l = 0
- ++ 적용: ++$l = 1
- $l 받기: $l = 1
- 적용 +: $l + $l = 1 + 1 = 2
모든 문은 오른쪽에서 왼쪽으로 실행됩니다.따라서 값은 변수의 값 = 1보다 먼저 증가하므로 1+1=2
언급URL : https://stackoverflow.com/questions/9709818/why-is-a-a-2
'programing' 카테고리의 다른 글
IE에서 "경계 반경" 지원 (0) | 2023.08.24 |
---|---|
함수의 필수 및 기본 매개 변수 (0) | 2023.08.24 |
Angular2에서 원시 html을 바인딩하는 방법 (0) | 2023.08.24 |
도커 합성을 통해 도커 컨테이너에 정적 IP 제공 (0) | 2023.08.24 |
도커 컴포지트와 도커 컴포지트 스타트의 차이점은 무엇입니까? (0) | 2023.08.24 |