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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 でアプリの優先度を安全に設定するにはどうすればよいですか? Windows 11 でアプリの優先度を安全に設定するにはどうすればよいですか? May 06, 2023 pm 06:28 PM

Windows は、システム リソースに優先順位を割り当てることで、システム リソースを最も必要とするプロセスやプログラムにうまく割り当てます。インストールするほとんどのアプリケーションは、デフォルトの「標準」優先度レベルでまったく問題なく動作します。ただし、パフォーマンスを向上させるために、ゲームなどのプログラムをデフォルトの通常レベルよりも高いレベルで実行する必要がある場合があります。しかし、これには代償が伴い、熟考する価値のある取引です。アプリを高優先度に設定するとどうなりますか? Windows には、さまざまなプロセスやプログラムの実行に対して、低、通常より下、通常、通常より上、高、リアルタイムの合計 6 つの優先順位レベルがあります。 Windows は、アプリケーションを優先度に基づいてランク付けし、キューに入れます。優先度が高いほど、アプリケーションは

Windows 11 で通知を無効にする 8 つの方法 (および 3 つのヒント) Windows 11 で通知を無効にする 8 つの方法 (および 3 つのヒント) May 05, 2023 pm 12:49 PM

通知は生産性を向上させる優れたツールですが、場合によっては気が散ってしまうことがあります。通知を完全に無効にする場合でも、選択したアプリに対して無効にする場合でも、このページが必要です。また、FocusAssist を使用して通知を自動的に無効または有効にする方法についても説明します。さらに、設定アプリが機能しない場合は、コマンド プロンプト、レジストリ エディター、グループ ポリシー エディターなどのツールを使用して、よりマニアックな方法で通知を無効にすることができます。 Windows 11 で通知を無効にする 7 つの方法については、次のチュートリアルをご覧ください。 Windows 11 で通知を無効にする必要があるのはなぜですか?通知を無効にするとさまざまな利点があり、その一部を以下に示します。ただし、重要なアプリの通知を無効にすると、

Windows 11のタスクマネージャーで優先度を変更する方法 Windows 11のタスクマネージャーで優先度を変更する方法 May 17, 2023 am 10:26 AM

プロセスの優先順位とは何ですか?コンピュータはその作成者とそれほど変わりません。彼らはマルチタスクを行っているように見えますが、実際には自発的にタスク間をジャグリングしています。ただし、すべてのプロセスやプログラムにリソースが均等に割り当てられるわけではありません。システムをできるだけスムーズに実行し続けるために必要なプロセスなど、重要なプロセスには高い優先度が与えられますが、周辺的にのみ機能するプロセスには低い優先度が割り当てられることがあります。これにより、システムに大きなストレスがかかっている場合でも、システムがスムーズに動作するようになります。優先順位とは何ですか?プロセスには 6 つの異なる優先順位があります。これらは次のとおりです: 低 – これは最も低い優先順位です。優先度が「低い」プロセスは、他のすべてのタスクが完了するまで必要なリソースを受け取りません。ノルマの下

Windows 11 でアプリまたはプロセスの生産性モードをオンまたはオフにする方法 Windows 11 でアプリまたはプロセスの生産性モードをオンまたはオフにする方法 Apr 14, 2023 pm 09:46 PM

Windows 11 22H2 の新しいタスク マネージャーは、パワー ユーザーにとって有益です。実行中のプロセス、タスク、サービス、ハードウェア コンポーネントを監視するための追加データにより、より優れた UI エクスペリエンスが提供されるようになりました。新しいタスク マネージャーを使用している場合は、新しい生産性モードに気づいたかもしれません。それは何ですか? Windows 11 システムのパフォーマンスの向上に役立ちますか?確認してみましょう! Windows 11 の生産性モードとは何ですか?生産性モードはタスク マネージャーのタスクの 1 つです

C言語のルート演算子とは何ですか? C言語のルート演算子とは何ですか? Mar 06, 2023 pm 02:39 PM

C 言語にはルート演算子はなく、ルートを開くには組み込み関数 "sqrt()" が使用され、構文 "sqrt(value x)" が使用されます (例: "sqrt(4)")。 4. に対して平方根演算を実行すると、結果は 2 になります。 sqrt() は C 言語の組み込みルート演算関数であり、その演算結果は関数変数の算術平方根であり、この関数は負の値を演算したり、虚数の結果を出力したりすることはできません。

Golang エラー:「... 演算子の使用が無効です」どうすれば解決できますか? Golang エラー:「... 演算子の使用が無効です」どうすれば解決できますか? Jun 24, 2023 pm 05:54 PM

Golang 開発者にとって、「invaliduseof...operator」はよくあるエラーです。このエラーは通常、可変長パラメーター関数を使用するときに発生します。これはコンパイル時に検出され、どの部分に問題があるかが示されます。この記事ではこのエラーの解決方法を紹介します。 1. 可変長引数関数とは 可変長引数関数とは、可変長引数関数とも呼ばれ、Golang 言語における関数の一種です。可変長パラメータ関数を使用すると、次のように複数のパラメータ関数を定義できます。

Linuxのプロセス優先度調整方法を詳しく解説 Linuxのプロセス優先度調整方法を詳しく解説 Mar 15, 2024 am 08:39 AM

Linuxのプロセスの優先度調整方法を詳しく解説 Linuxシステムでは、プロセスの優先度によってプロセスの実行順序やシステム内のリソースの割り当てが決まります。プロセスの優先順位を合理的に調整すると、システムのパフォーマンスと効率が向上します。この記事では、Linuxでプロセスの優先度を調整する方法と具体的なコード例を詳しく紹介します。 1. プロセス優先度の概要 Linux システムでは、各プロセスには優先度が関連付けられています。優先順位の範囲は通常 -20 ~ 19 で、-20 は最高の優先順位を表し、19 は最高の優先順位を表します。

Windows 11 で通知設定をカスタマイズする方法 Windows 11 で通知設定をカスタマイズする方法 May 02, 2023 pm 03:34 PM

一般的な通知設定のカスタマイズ 通知設定の基本から始めましょう。まず、Windows 11 で通知を設定する場合、2 つの方法があります。最も簡単な方法は、タスクバーの隅にある日付と時刻の部分を右クリックし、[通知設定] を選択することです。または、[スタート] メニューを使用して設定アプリを開き、[システム] セクションの [通知] を選択することもできます (デフォルトで開きます)。ここに通知設定の概要が表示されます。通知を完全に無効にすることも、最初のオプション [通知] をクリックしてドロップダウン メニューを展開することもできます。このメニューには、通知音をオフにするなどの追加オプションがいくつかあります。リマインダーや着信の特定の設定など、ロック画面に通知を表示するかどうかを選択することもできます。

See all articles