$ 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 문서에 따르면 혼합 +
및 ++
이러한 방식은 정의되지 않은 동작이므로 1 또는 2를 얻을 수 있습니다. 다른 버전의 PHP로 전환하면 결과가 변경 될 수 있으며 유효합니다.
다음과 같은 예 1을 참조하십시오 .
// 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);
또는 작성 :
합계 연산이 수행되는 순간은 이미 평가되었으므로 이미 $a
1 ++$a
입니다. ++
작업자가 먼저 평가된다 +
연산자.
재미를 위해 :
$a++ + ++$a
결과도 2입니다. 그러나 표현식으로 비교하면 같지 않습니다.
$a++ + ++$a == $a + ++$a
어디로
$a++ + ++$a == $a-- + --$a
는 같다".
또한보십시오:
PHP 블로그 게시물의 My Evaluation Order에 대해 자세히 설명하지만 기본 아이디어는 다음과 같습니다.
- 연산자 우선 순위 및 연관성은 평가 순서와 관련이 없습니다.
- PHP는 평가 순서를 보장하지 않습니다. 순서는 예고없이 PHP 버전간에 변경 될 수 있으며 주변 코드에 따라 다를 수도 있습니다.
- "Normally" PHP will evaluate left-to-right, with the exception of accesses to "simple" variables (like
$a
). Accesses to simple variables will be executed after more complex expressions, regardless in which order the expressions actually occur. - In this particular case it means that
++$a
is run first because it is a complex expression and only then the value of$a
is fetched (it is already 1 at this point). So effectively you are summing1 + 1 = 2
. - The reason that simple variables are fetched after complex expressions is the Compiled Variables (CV) optimization. If you disable this optimization, for example by using the
@
error suppression operator, all expressions are evaluated left-to-right, including simple variable fetches. - In this particular case it means that
@($a + ++$a)
will result in1
, because first$a
is fetched (0 at that time) and incremented only after that.
++
is the higher precedence operator, so it gets applied first.
So now l = 1.
So 1 + 1 = 2.
When you do your ++$l (preincrement), it will be done before your addition -> check operator precedence).
So, the value of $l
will be 1
before your addition :
echo $l + ++$l; // $l => 1 because ++$l is done first
So your answer will be 2.
But when you do :
echo $l // you will get your first value which is $l => 1
So your answer will be 1.
This behaviour can be confirmed by inspecting how PHP compiles your script, for example:
$a = 0;
echo $a + ++$a;
Compiles into the following opcodes, which are then executed:
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
This translates to the following equivalent script:
$a = 0; // ASSIGN
$tmp = ++$a; // PRE_INC
echo $a + $tmp; // ADD, ECHO
Conclusion
By the time $a
is evaluated as the left hand expression of $a + (++$a)
, it has already been incremented, because ++$a
was evaluated first.
Obviously, this behaviour should not be relied upon; in any language for that matter.
Check the increment operator manual:
http://www.php.net/manual/en/language.operators.increment.php
Or see this codepad: 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;
Outputs:
++ before:2
++ after:1
n:1
m:1
As you may know we have two increment operator, one is pre-increment and second is post-increment. Pre-increment increase the value of integer before it use in expression, on the other hand post increment increase value of number after it used in expression.
suppose you have variable $a and variable $b as below
$a=0;
$b=++$a gives the value of b=1
while
$b=$a++ gives the value b=0
The output of your code varies with PHP version as seen here
Output for 4.3.0 - 5.0.5
1
1
In the above case the left hand side of +
operator is evaluated first (0, 1, +).
Output for 5.1.0 - 5.5.0alpha4
2
1
In the above case the right hand side of +
operator is evaluated first (1, 1, +).
This is in accordance with interjay's answer that in PHP there is no guarantee about the order of evaluation of sub-expresions. The assumption that the output could be 1, 1
is correct, so are that answers that claim that the output could be 1, 2
.
First obvious part is that ++
have higher priority than +
.
Second part is that php engine doesn't store value from first operand into another anonymous variable. So $l + ++$l
is not an qeuivalent for
$a = $l;
$b = ++$l;
return $a + $b;
As mentioned before there is a difference in x++ and ++x. You can interpret it in the way that
x++;
increments after the semicolon
and
++x;
increments on evaluation of the expression
So it seems that your expression is evaluated from right to left
echo $l + ++$l;
- Get $l: $l = 0
- Apply ++: ++$l = 1
- Get $l: $l = 1
- Apply +: $l + $l = 1 + 1 = 2
All statements are executed from right to left. So the value is first incremented than the value of your variable is = 1 so 1+1=2
참고URL : https://stackoverflow.com/questions/9709818/why-is-a-a-2
'Programing' 카테고리의 다른 글
vim regex는 여러 연속 공백을 하나의 공백으로 만 바꿉니다. (0) | 2020.11.16 |
---|---|
jQuery UI datepicker에서 오늘 날짜를 기본 날짜로 설정 (0) | 2020.11.16 |
Visual Studio Code가 EJS 파일의 HTML 구문을 인식하도록하는 방법이 있습니까? (0) | 2020.11.16 |
코더 혼수 상태에 어떻게 대처합니까? (0) | 2020.11.15 |
Intellij 핫 코드 스왑을 활성화하는 방법 (0) | 2020.11.15 |