백엔드 개발 PHP 튜토리얼 PHP 연산자 우선순위에 대한 예외

PHP 연산자 우선순위에 대한 예외

Oct 15, 2019 pm 05:10 PM
우선 사항 연산자

PHP 연산자 우선순위에 대한 예외

今天在老王的技术手册看到一个问题:

<?php
if ($a = 100 && $b = 200) {
     var_dump($a, $b);
}
로그인 후 복사

输出是什么?

这个问题, 咋一看或许觉得简单, 但其实仔细推敲并不简单,

如果说布尔与之前的部分, 是由于优先级的问题, 但是如果仅仅是优先级的问题的话, 那么结果应该是:

$a = (100 && $b) = 200
로그인 후 복사

而实际上的结果, 确实高优先级的&&让步给次优先级的=, 让 $b = 200 先结合了.

究其原因, 是因为PHP并不完全遵守优先级的定义, 这个在PHP的手册中也有说明:

Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

这样的设计, 个人不发表看法, 反正在C语言中, 这样类似的语句是判定为语法错的. PHP采用这样的设计, 很可能是历史原因,

有好奇的同学, 会想知道到底为什么, 之前jayeeliu网友也问过:

laruence你好:

问一个php运算符优先级的问题

$t == 1 && $tt = 2

按照php运算符优先级应该是

(($t == 1) && $tt) = 2

这个顺序执行,但实际上应该是

($t == 1) && ($tt = 2)

我有些不太理解。

其实也简单, 运算符优先级是在存在二义性文法的时候的一种规约规则选择的手段, 而PHP的语法分析文件定义中, 却让等号和T_BOOLEAN_AND(&&)之前不存在了规约冲突:

expr_without_variable:
  // 有隐规则存在, 相当于T_BOOLEAN_AND成为了"一元操作符".
  |   expr T_BOOLEAN_AND  { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } expr
로그인 후 복사

最后, 顺便说一下, PHP对应于T_BOOLEAN_AND 还定义了 T_LOGICAL_AND(and) 和 T_LOGICAL_OR(or) , 这俩个的优先级都低于等号, 于是就会有了, 很多PHP入门教材示例代码中经典的:

$result = mysql_query(*)  or die(mysql_error());
로그인 후 복사

类似的还可以用or来实现三元操作符(?:)的功能:

$person = $who or $person = "laruence";
//等同于:
$person = empty($who)? "laruence" : $who;
로그인 후 복사

 更多PHP相关知识,请访问PHP中文网

위 내용은 PHP 연산자 우선순위에 대한 예외의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Windows 11에서 앱의 우선순위를 안전하게 설정하는 방법은 무엇입니까? Windows 11에서 앱의 우선순위를 안전하게 설정하는 방법은 무엇입니까? May 06, 2023 pm 06:28 PM

Windows 11에서 앱의 우선순위를 안전하게 설정하는 방법은 무엇입니까?

Windows 11에서 알림을 비활성화하는 8가지 방법(및 3가지 팁) Windows 11에서 알림을 비활성화하는 8가지 방법(및 3가지 팁) May 05, 2023 pm 12:49 PM

Windows 11에서 알림을 비활성화하는 8가지 방법(및 3가지 팁)

Windows 11 작업 관리자에서 우선 순위를 변경하는 방법 Windows 11 작업 관리자에서 우선 순위를 변경하는 방법 May 17, 2023 am 10:26 AM

Windows 11 작업 관리자에서 우선 순위를 변경하는 방법

Windows 11에서 앱이나 프로세스에 대해 생산성 모드를 켜거나 끄는 방법 Windows 11에서 앱이나 프로세스에 대해 생산성 모드를 켜거나 끄는 방법 Apr 14, 2023 pm 09:46 PM

Windows 11에서 앱이나 프로세스에 대해 생산성 모드를 켜거나 끄는 방법

C 언어의 루트 연산자는 무엇입니까? C 언어의 루트 연산자는 무엇입니까? Mar 06, 2023 pm 02:39 PM

C 언어의 루트 연산자는 무엇입니까?

%는 Java에서 무엇을 의미합니까? %는 Java에서 무엇을 의미합니까? Mar 06, 2023 pm 04:48 PM

%는 Java에서 무엇을 의미합니까?

Golang 오류: '잘못된 ... 연산자 사용' 어떻게 해결하나요? Golang 오류: '잘못된 ... 연산자 사용' 어떻게 해결하나요? Jun 24, 2023 pm 05:54 PM

Golang 오류: '잘못된 ... 연산자 사용' 어떻게 해결하나요?

Windows 11에서 알림 설정을 사용자 지정하는 방법 Windows 11에서 알림 설정을 사용자 지정하는 방법 May 02, 2023 pm 03:34 PM

Windows 11에서 알림 설정을 사용자 지정하는 방법

See all articles