うーん
説明してください。
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;
その他の類似点
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;
これが私たちの理解方法です
(++$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++ は最初に値を返すことを意味します$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++) まずは値を取得してから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
对于
$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;
アプリケーションの存在により、状況はさらに複雑になります
代入処理があるため$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 に、これは
$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--; ;