찾다

 >  Q&A  >  본문

PHP 연산자 우선 순위를 이해하는 방법은 무엇입니까?

<코드><?php
$a = 1;
$b = 2;
$c = 3;
$d = 4;
$a = $b !== $c && $d = $b == $c;
var_dump($a,$d);종료;

여기서 내가 이해하는 것은 다음과 같습니다. 첫째, !==가 &&보다 우선순위가 높기 때문에 먼저 $b !== $c(참) 및 $b == $c*(거짓)를 판단한 다음 && 판단을 수행하고 &&의 경우 왼쪽을 먼저 실행한 다음 결과에 따라 오른쪽을 실행합니다. 그러면 왼쪽은 $a = true이고 오른쪽은 $d = false인데 왜 인쇄됩니까? $a 거짓인가요? 그러면 이것이 실제로 다음과 같다는 것을 이해합니다:

$a = (true && ($d = false));

이것을 이해할 수 없습니다. &&가 왼쪽의 표현식을 참조하지 않고 왼쪽의 $b !== $c 값을 참조하는 경우 $d = false가 오른쪽에서 실행될 수 있는 이유는 무엇입니까? 이 조합은 무엇인가요?
많은 정보를 확인하고 여러 동료들에게 물어보니 다들 설명하기 어렵고 일상적인 개발에는 사용할 수 없다고 합니다. 강박장애, 정말 알고 싶습니다. PHP의 연산자 우선순위와 실행 문제를 이해하고 판단하는 방법에 대해 조언을 좀 부탁드립니다. 실제로 오픈 소스에는 이러한 작성 방법이 많이 있습니다.
사실 $a = $b && $b = $ c;와 유사합니다. 마지막으로 $a는 true이지만 $b는 $c의 값입니다. 위의 세 변수 abc는 모두 1, 2, 3입니다.

伊谢尔伦伊谢尔伦2827일 전553

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:06:40

    논리 연산자의 경우 각 논리 연산자의 양쪽 표현식이 전체로 결합됩니다.
    $b !== $c && $d = $b = = $c, 이 표현식의 경우 두 가지 조합이 생성됩니다: $b !== $c && $d = $b == $c,对于这个表达式,将会生成两个组合:
    ($b !== $c) && ($d = $b == $c)
    组合1: ($b !== $c)
    组合2: ($d = $b == $c)
    所以先执行组合1($b !== $c),结果是true,根据短路运算,需要执行组合2($d = $b == $c),对于这个组合,里面又由于==运算符优先级高,执行==,在赋值,也就是false. 所以最终组合1的结果是true,组合2的结果是false,所以$a=false.
    这里解释了可以执行右边的赋值表达式,而不执行左边的赋值表达式,因为左边的赋值表达式优先级低,在执行它之前,需要执行完!==, 再执行&&,之后接着执行==,再执行右边的=,再执行左边的=($b !== $c) && ($d = $b == $c)combination 1 : ($b !== $c)

    조합 2: ($d = $b == $c)🎜그러므로 조합 1( 첫 번째 $를 실행하세요. b !== $c), 단락 동작, 조합 2 ($d = $b == $c)true입니다. code>를 실행해야 합니다. 이 조합의 경우 == 연산자의 우선순위가 높기 때문에 할당하기 전에 ==가 실행되며 이는 false이므로 결국 조합 1의 결과는 true이고, 조합 2의 결과는 false이므로 $a=false입니다. 🎜🎜여기에서는 왼쪽의 할당식을 실행하는 대신 오른쪽의 할당식을 실행해도 된다고 설명합니다. 왜냐하면 왼쪽의 할당식은 실행하기 전에 !==를 실행한 다음 &&를 실행하고 ==를 실행한 다음 오른쪽의 =를 실행한 다음 를 실행해야 합니다. = 왼쪽🎜.🎜

    회신하다
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-16 13:06:40

    하소연 하러 왔습니다. 이 줄은 $a = $b !== $c && $d = $b == $c;주의깊게 복사해서 붙여넣었습니다. 하하, 666..

    형님:
    1. 그런 코드는 책에 있습니다.
    2. 그런 코드 프로젝트는 거의 존재하지 않습니다. 0
    3 비슷한 요구 사항이 있더라도 가독성을 높이기 위해 ()를 사용합니다. 더 강한 모델
    4. 이러한 요구 사항은 간단하게 이해될 수 있지만 사용성이 강하지는 않습니다.

    회신하다
    0
  • 취소회신하다