私は1つのステートメントで苦労していました。これをCとPHPで実行すると、答えは5になります。しかし、同じコードではJavaで4が返されます。誰かがこの違いを説明できますか?C、PHP、javaで異なる出力
int x=1,y=1;
x+=y+=x+=y;
この実行後のxの値が懸念されます。
私は1つのステートメントで苦労していました。これをCとPHPで実行すると、答えは5になります。しかし、同じコードではJavaで4が返されます。誰かがこの違いを説明できますか?C、PHP、javaで異なる出力
int x=1,y=1;
x+=y+=x+=y;
この実行後のxの値が懸念されます。
Cでは、式x+=y+=x+=y
の振る舞いは、であり、定義されていません。です。文字通りどんな結果も可能です。問題は、例外を除いて、Cが式が評価される順序や副作用が適用される順序を指定しないことです。 x
またはy
が特定の順序で更新されるという保証はありません(+=
演算子はシーケンスポイントを導入しません)。したがって、プラットフォーム、ビルドなどによって結果は異なりますが、実際には実行されるものの、実行するまで実行する必要はありません。
はい、表現はx+=(y+=(x+=y))
としてを解析し、それは一番右x+=y
が評価された後x
の値はすぐを更新していることを意味するものではありません。
はここで出力を説明できる評価や副作用の1つの可能シーケンスです:Cとは異なり
t0 <- x + y // t0 == 2
t1 <- y + t0 // t1 == 3
y <- t1 // y == 3
x <- t0 // x == 2
x <- x + t1 // x == 5
、Javaは側面、(すべてが左から右に評価され、評価や副作用の特定の順序を強制的にエフェクトはすぐに適用されるため)、結果はJavaで明確に定義されています。
PHPについての手がかりではありません。
これは*未定義の動作*を呼び出すため、C言語では何も正しくありません。 – MikeCAT
PHPの解析エラーです。 – AbraCadaver
Offcourse、それは$記号が追加されていないためです。しかし、私は出力5で私と一緒に実行している – Atif