目次
ディスカッションへの返信(解決策)
ホームページ バックエンド開発 PHPチュートリアル 追加してもらえますか?本当に迷っています!助けを求める、説明を求める

追加してもらえますか?本当に迷っています!助けを求める、説明を求める

Jun 23, 2016 pm 02:20 PM

うーん
説明してください。


ディスカッションへの返信(解決策)


1) 式は左から右に実行されるため、この時点では $a はまだ 1,1+2=3 です

2) これも左から右に実行されます, ++$ a は 2. この時、既に $a が単独で加算されているので、 2+2=4

3)++$a が単独で加算されます この時、まず $a の値が加算されます。は2で、次の$a++が後から勝手に追加されるので、2+2=4

4) 参照の値が変更されるので、2+3=5

$a = 1;
$c; = $a + ($a++);
var_dump($c, $a );//3, 2
$a++ は $a = $a + 1 と同等です
したがって
$c = $a + ($a++) ;

$c = 2 + (1) と同等です。
加算の交換法則によれば、
$c = $a + ($a++) は
$c = ($a++) + $a と同等です。 ; //こうやって書くと、難しくないですよね?
と同等
$c = (1) + 2;

その他の類似点


1) 式は左から右に実行されるため、この時点では $a はまだ 1,1+2=3 です


2 ) これも左から右に実行されます。++$a は 2 です。このとき $a は勝手にインクリメントされていますので、2+2=4

3) ++$a は最初に勝手にインクリメントされます。今回は $a の値が 2 で、次の $a++ はポストインクリメントなので 2+2=4

4) 参照の値を変更するので 2+3=5 になります

お願いします3 番目と 1 番目の違いを説明してください。なぜ 1 番目は 2 ではないのでしょうか?
$a = 1;

var_dump( $c, $a);//4, 3


これが私たちの理解方法です
(++$a) まず 1 を加算し、次に値を取得します
$a (2) の値を取得し、操作に参加します
($a++) まず値を取得してから 1 を加算します
$a の値を取得します (2) 操作に参加します
$c = (2) + (2)
この時点で $a は既に 3 ですが
ただし計算に関係するものはすべてスカラーであり、変数はありません
式 1 との違いに注意してください


xu についてはまだよくわかりません 式 1 と式 1 の違いを理解してください。式 3 の分析に従えば、もちろん、これは間違いです。式 1 と式 3 の主な違いは何ですか?....

$c = $a + ($ a++);

は変数を使用して、演算

xu 式 1 との違いがまだよくわかりません。式 3 の分析に従ってみると、結果は 2 になります。もちろん、これは間違いなく間違っています。式 1 と式 3 の核心的な違いはどこですか? ...


++$a
は、$a が最初に 1 を加算してから $a の値を返すことを意味します

$a=$a+1 と同等です;

は $a を返します

$a++ は最初に値を返すことを意味します$a を返し、$a に 1 を追加します

Return $a;


例:
$a=1; // 最初に $a を返し、次に追加します1 to $a、echo $a=$a+1; 出力は 1 です

echo ++$a; // まず $a に 1 を加算し、$a を返します。 $a=$a+1; echo $a; と同等 出力は 2 です

xu と式 1 の違いがまだよくわかりません。式 3 の分析に従うと、結果は 2 になります。もちろん、これは間違いです。式 1 と 3 つの式の主な違いは何ですか?.... あなたも混乱していますね?
$a = 1; $c = (++$a) +($a++);
var_dump ($c, $a);//4, 3

これが私たちの理解です
(++$a) まず 1 を加算し、次に値を取得します

の値を取り出します$a (2) して演算に参加

($a++) まずは値を取得してから1を足す

$a (2) の値を取り出して演算に参加

$c = (2) + (2)
この時点で $a は既に 3 ですが
、計算に関わるものはすべてスカラーで変数はありません
式 1 との違いに注意してください
Bamboo さんの 2 つの回答をもとに、1 番目と 3 番目の説明は次のようになります。括弧がある場合、まず括弧内の計算が実行され、その後スカラーに変換されてから計算されますよね。
まだ混乱していますが、最後の結果が 5 であることをどのように理解すればよいですか?

1) 式は左から右に実行されるため、$a はまだ 1、この時点では 1+2=3 です

2) 式も左から右に実行され、++$a は 2、そして$a は自動的に追加されているので、2+2=4

3)++$a が最初に追加され、次に $a の値が 2 になり、次の $a++ が後で追加されるため、2+2= 4

4) なぜなら、参照の値を変更することなので、2+3=5 です
1つ目は説明が間違っているようです。

又无括号多没有关系,你这都是加法运算,由加法的结合律可知,无论是否有括号,括号加在哪里,都不会影响最终的结果

$a = 1;$c = (++$a)+($a++);var_dump($c);//4$a = 1;$c = ++$a + $a++;var_dump($c);//4$a = 1;$c = $a++ + ++$a;var_dump($c);//4
ログイン後にコピー
ログイン後にコピー

又无括号多没有关系,你这都是加法运算,由加法的结合律可知,无论是否有括号,括号加在哪里,都不会影响最终的结果

$a = 1;$c = (++$a)+($a++);var_dump($c);//4$a = 1;$c = ++$a + $a++;var_dump($c);//4$a = 1;$c = $a++ + ++$a;var_dump($c);//4
ログイン後にコピー
ログイン後にコピー
那请问最后一个引用后变成5的那个怎么解释。

对于
$a = 1;
$b = &$a;
var_dump($c);//5
由于应用的存在,情况要复杂点

由于有一个对 $b 的赋值过程,这相当于
$a = 1;
$c = (++$a)+($b = $a+1);
var_dump($c);//5

对于
$a = 1;
$b = &$a;
var_dump($c);//5
由于应用的存在,情况要复杂点

由于有一个对 $b 的赋值过程,这相当于
$a = 1;
$c = (++$a)+($b = $a+1);
var_dump($c);//5 不明白。还是有点晕。

反正执行过程中 $a++不影响$a的值,而是执行完毕才改变,类似for $i=...循环,$i在退出循环后值还要+1
++$a则是在执行过程中就改变了$a的值,执行后则不变

$b=&$a 导致了$a++做了“执行后”这个动作,所以$a++也递增了

我习惯就是这样理解的,也不知是否合适

$c =  $a + ($a++);
是以变量参与运算的


xu大我还是不太理解和1式的区别  如果按照3式的分析,得到结果是2,当然这肯定是不对的  1式和3式的核心区别在哪里呢?....

$a=1;
$c= $a+($a++);
红色的$a是以变量参与运算,但是为什么是2呢? 难道$a+($a++)先运行($a++)部分吗?  
测试过去掉$a++的括号结果还是一样,那么跟括号没有关系。那么表达式不是从左往右计算吗?

$c =  $a + ($a++);
是以变量参与运算的


xu大我还是不太理解和1式的区别  如果按照3式的分析,得到结果是2,当然这肯定是不对的  1式和3式的核心区别在哪里呢?....

估计得这么理解

function returnFirst(&$a)
{
    $return=$a;
    $a=$a+1;
    return $return;
}

function plusFirst(&$a)
{
     $a=$a+1;
     $return=$a;
     return $return;
}


$a=1;
$c=$a+returnFirst($a)  ; //$c=$a+(a++) 
var_dump($c,$a); //3,2


对于
$a = 1;
$b = &$a;
var_dump($c);//5
由于应用的存在,情况要复杂点

由于有一个对 $b 的赋值过程,这相当于
$a = 1;
$c = (++$a)+($b = $a+1);
var_dump($c);//5




那如果是
$c=($a++)+($a++) 要理解成 $c=($b=$a+1)+($b=$a+1)吗?  
$c=($a++)+($a++) 返回的结果是3


对于
$a = 1;
$b = &$a;
var_dump($c);//5
由于应用的存在,情况要复杂点

由于有一个对 $b 的赋值过程,这相当于
$a = 1;
$c = (++$a)+($b = $a+1);
var_dump($c);//5




那如果是
$c=($a++)+($a++) 要理解成 $c=($b=$a+1)+($b=$a+1)吗?  
$c=($a++)+($a++) 返回的结果是3 更晕了,听了你的一席话,我又觉得斑竹的解释有问题了。。。

$a = 1;
$b = &$a;
var_dump($c);//5
アプリケーションの存在により、状況はさらに複雑になります

$への代入処理があるためb、これはかなりです
$a = 1;
$c = (++$a)+($b = $a+1);

この問題も同様ですtorturous

$b=&$a のとき、演算式の一番左辺に (++$a) があるときだけ予期せぬ事態が起こるようです。
つまり:
(++$a)+式 2+式 3...
注: 式は ($a++) または (++$a) です

3 番目の式からの結果はすべて最初からつまり、(++$a)+式 2 の結果にのみ影響します。

最初の n 個の式の合計が Sn であると仮定し、演算後は $a=5;
Sn+($a++)=Sn+5;
Sn+(++$a)=Sn+6;つまり、($a++) を関数 returnFirst(&$a){ $return=$a+1; } として扱います。 a) { $a=$a+1; return $a;} 正しく計算されています


この問題に関しては PHP の設計上の欠陥でしょうか?もしそうなら、それは非常に高いでしょう、私がこのレベルの問題に遭遇したのは初めてです。


$a = 1;
$b = &$a;

var_dump($c);//5

アプリケーションの存在により、状況はさらに複雑になります

代入処理があるため$b に、これは
$a = 1;
$c = (++$a)+($b = $a+1); と同等です

この問題拷問すぎる

$b=&$aのとき、演算式の一番左辺に(++$a)があるときだけ予期せぬ事態が起こるようです。
つまり:
(++$a)+式 2+式 3...
注: 式は ($a++) または (++$a) です

3 番目の式からの結果はすべて最初からつまり、(++$a)+式 2 の結果にのみ影響します。

最初の n 個の式の合計が Sn であると仮定し、演算後は $a=5;
Sn+($a++)=Sn+5;
Sn+(++$a)=Sn+6;つまり、($a++) を関数 returnFirst(&$a){ $return=$a+1; } として扱います。 a) { $a=$a+1; return $a;} 正しく計算されています


この問題に関しては PHP の設計上の欠陥でしょうか?もしそうなら、それは非常に高いでしょう、私がこのレベルの問題に遭遇したのは初めてです。 あなたも混乱していますか?


$a = 1;
$b = &$a;
var_dump($c);//5
アプリケーションの存在により、状況はさらに複雑になります

代入処理があるため$b に、これは

$a = 1;

$c = (++$a)+($b = $a+1); と同等です

この問題拷問すぎる

$b=&$aのとき、演算式の一番左辺に(++$a)があるときだけ予期せぬ事態が起こるようです。
つまり:
(++$a)+式 2+式 3...
注: 式は ($a++) または (++$a) です

3 番目の式からの結果はすべて最初からつまり、(++$a)+式 2 の結果にのみ影響します。

最初の n 個の式の合計が Sn であると仮定し、演算後は $a=5;
Sn+($a++)=Sn+5;
Sn+(++$a)=Sn+6;つまり、($a++) を関数 returnFirst(&$a){ $return=$a+1; } として扱います。 a) { $a=$a+1; return $a;} 正しく計算されています


この問題に関しては PHP の設計上の欠陥でしょうか?もしそうなら、それは非常に高いでしょう、私がこのレベルの問題に遭遇したのは初めてです。

つまり、($a++) を関数 returnFirst(&$a){ $return=$a; return $return } として扱います。 plusFirst (&$a){ $a=$a+1; return $a;} は正しく計算されています
この文は言われていないそうです。 。計算後 $a の値を返すのに半日かかりました



$a = 1;
$b = &$a;
var_dump($c);//5
アプリケーションの存在により、状況はさらに複雑になります

代入処理があるため$b に、これは
$a = 1;
$c = (++$a)+($b = $a+1); と同等です

この問題拷問すぎる

$b=&$aのとき、演算式の一番左辺に(++$a)があるときだけ予期せぬ事態が起こるようです。
つまり:
(++$a)+式 2+式 3...
注: 式は ($a++) または (++$a) です

3 番目の式からの結果はすべて最初からつまり、(++$a)+式 2 の結果にのみ影響します。

最初の n 個の式の合計が Sn であると仮定し、演算後は $a=5;
Sn+($a++)=Sn+5;
Sn+(++$a)=Sn+6;つまり、($a++) を関数 returnFirst(&$a){ $return=$a+1; } として扱います。 a) { $a=$a+1; return $a;} 正しく計算されています


この問題に関しては PHP の設計上の欠陥でしょうか?もしそうなら、それは非常に高いでしょう、私がこのレベルの問題に遭遇したのは初めてです。

つまり、($a++) を関数 returnFirst(&$a){ $return=$a; return $return } として扱います。 plusFirst (&$a){ $a=$a+1; return $a;} は正しく計算されています
この文は言われていないそうです。 。半日後に $a の値が返されました

つまり、
$c = $a + ($a++);
var_dump($c);//3

$a = 1 ;
$c = (++$a)+$a;
var_dump($c);//4
$a = 1;
$c = (++$a)+($a++ ); ($c);//4

2 番目と 3 番目のケースは理解しやすく、単純に左から右に向かっており、「最初に追加してから返す」または「最初に返してから追加」の要件に準拠しています。
最初のケースで、左から右への操作の場合、「最初に返してから加算する」という理解と矛盾しているように思えます。ただし、操作の順序を右から左に従えば、説明は理解できます。
演算式中に変数や自己加算演算が出現した場合、PHPでは優先順位があり、自己加算処理が先に行われると推測します。
同様に、
($a++) は関数 returnFirst(&$a){ $return=$a; $a=$a+1; } と同じです
(++$a) は関数 plusFirst と同等です(& $a){ $a=$a+1; return $a;}

したがって、($a++) を returnFirst(&$a) に置き換える場合、(++$a) を plusFirst(&$a) に置き換えます。 )
上記の 3 つの状況はすべて説明できます。

ただし、変数参照を使用して 4 番目のケースをリストしました
$b = &$a;
var_dump($c ); //5

注:
($a++) または (++$a) を部分式と呼びます
いくつかの ($a++) または (++$a) を追加したものを式と呼びます

がある場合($a++) と (++$a) を複数追加した場合の変数参照
(++$a) が演算式の左辺にある場合のみ予期せぬ事態が発生します ( と矛盾する結果を指します)関数で置き換えます)、予期しない
は (++$a)+"部分式 2" の結果にのみ影響します。
つまり、(++$a)+"部分式 2" の結果がすでにわかっている場合でも、関数を使用して "部分式 2" の後の "部分式" を置き換えて結果を計算できます。


まとめると、($a++) は returnFirst($a) で理解でき、(++$a) は plusFirst($a) で理解できると思います。
4 番目の予期せぬ状況は、自己追加と参照が同時に出現する場合に考慮されていなかった PHP の設計上の欠陥である可能性があります。もちろん、これは私の推測です



C/C++ と PHP では、加算する前と後では結果が異なります。それに比べて、C/C++ は zend カーネルを使用します。より柔軟に理解できるようになります。

C/C++ と PHP では加算の前後の結果が異なります。PHP はメモリ内の変数の割り当てを操作するために zend カーネルを使用します。それに比べて、C/C++ は理解しやすいです。 それを理解するのを手伝ってください。 。 。分かりやすければ。

上記のさまざまな説明を読んだ後、私は常に、どの説明も現実離れしていると感じずにはいられません。これは機能ではなく PHP のバグと考えるべきだと思います。
vld ツールを使用すると、PHP の動作プロセスを確認できます。
最初のステップでは、++$a で取得した式の値を $1 で表します。
2番目のステップでは、$a++で得られた式の値を$2で表します。
3 番目のステップは、$1 + $2 を計算することです。
このプロセスは手間がかからないはずです。

重要なのは、++$a の結果は何でしょうか? $a++ の結果はどうなるでしょうか?
++$a の場合、PHP はインクリメントされた $a を使用して式の結果を表します。つまり、$1 と $a は PHP の下部にある同じ zval を指します。
$a++ に関しては、php はまず $a を $2 としてコピーし、次に $a に 1 を加算します。 つまり、今後、$2 と $a は 0.5 セントの関係を持たなくなります。

問題の鍵は、2 番目のステップの $a++ が $a の値を変更することです。$a は参照型であるため、この操作は $a のコピーに対して実行されず、値が同期的に変更されます。 $a の式は $1 と評価されます ($a と $1 は同じものであるため)。

興味のある学生は、php のソース コードを見て、zend_vm_def.h で PRE_INC を検索して、「prefix++」の基礎となる実装を見つけることができます。 PRE_DEC はプレフィックスです。操作にも同じ問題があります。
これらを理解すると、期待した結果を満たさない式をさらに簡単に作成できます

試してみてください
$b = &$a;

echo ++$a + $a++ ;
エコー ++$a + $a*=2;

エコー --$a + $a--;

エコー ++$a + $a--; ;

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles