programing

$a + + + $a가 == 2인 이유는 무엇입니까?

mailnote 2023. 8. 24. 22:23
반응형

$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로 전환하면 결과가 변경될 수 있으며, 결과도 마찬가지로 유효합니다.

다음과 같은 예 1을 참조하십시오.

// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5

주의:

  1. 측정 시스템 우선 순위는 평가 순서를 결정하지 않습니다.연산자 우선 순위는 식이 다음과 같이 결정됩니다.$l + ++$l는 로해됩니다로 됩니다.$l + (++$l)하지만 왼쪽 피연산자인지 오른쪽 피연산자인지는 결정하지 않습니다.+연산자가 먼저 평가됩니다.왼쪽 피연산자를 먼저 평가하면 결과가 0+1이 되고 오른쪽 피연산자를 먼저 평가하면 결과가 1+1이 됩니다.

  2. 측정 시스템 연관성도 평가 순서를 결정하지 않습니다.그것은+연산자의 연관성은 다음과 같이 결정됩니다.$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 블로그 게시물에 있는 나의 평가 순서는 이것을 자세히 설명하지만, 여기에 기본 아이디어가 있습니다.

  • 연산자 우선 순위 및 연관성은 평가 순서와 관련이 없습니다.
  • 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;
  1. $l 가져오기: $l = 0
  2. ++ 적용: ++$l = 1
  3. $l 받기: $l = 1
  4. 적용 +: $l + $l = 1 + 1 = 2

모든 문은 오른쪽에서 왼쪽으로 실행됩니다.따라서 값은 변수의 값 = 1보다 먼저 증가하므로 1+1=2

언급URL : https://stackoverflow.com/questions/9709818/why-is-a-a-2

반응형