1. prinf 関数のパラメーターにはポインター式が含まれていますが、それらはどのような順序で計算されますか? コード操作の結果は明らかに左から右ではありません。
光阴似箭催人老,日月如移越少年。
1 つのステートメント内で変数を複数回変更することは未定義の動作であり、異なるプラットフォームでは異なる結果が生じる可能性があります。この質問は意味がありません。
printf{"%d",++i}は2つの操作を意味します
printf{"%d",++i}
最初に i=i+1 を実行し、次に i を出力します
そして i++ は
最初に出力し、次に i=i+1 を実行します
関数パラメータの演算順序は、関数の内部ロジックとはほとんど関係がありません。スタックにプッシュする前 (関数が実行される前) に計算される必要があります。特定のシーケンスを知りたい場合は、アセンブリコードを参照してください (具体的な意味は明日更新されます、申し訳ありません) ++p,函数结束后,再计算p++ リーリー
++p
p++
結果に表示される 2 と 3 はまだ説明できます。 4 非常に不思議なことですが、しぶしぶ説明すると、*(++p)++ の外側の ++ も p 動作します しかし、p++ の形式の演算子はステートメントの終了後にインクリメントされる必要があるため、この説明は明らかに間違っています。 *(++p)++括号外面的++也对p起作用了,但是形如p++运算符,应该在语句结束后才自增的,所以这样解释明显不对。我在Cygwin + gcc (GCC) 5.4.0 Cygwin + gcc (GCC) 5.4.0 環境です。 実行結果は次のとおりです。 使用されている環境は次のとおりです。
*(++p)++
++
p 動作します しかし、p++ の形式の演算子はステートメントの終了後にインクリメントされる必要があるため、この説明は明らかに間違っています。 *(++p)++括号外面的++也对p起作用了,但是形如p++运算符,应该在语句结束后才自增的,所以这样解释明显不对。我在Cygwin + gcc (GCC) 5.4.0 Cygwin + gcc (GCC) 5.4.0 環境です。 実行結果は次のとおりです。 使用されている環境は次のとおりです。
p
Cygwin + gcc (GCC) 5.4.0
関数パラメータがスタックにプッシュされる順序は確実です参数的求值顺序是未指定的,编译器只保证在printf调用之前,所有参数的值是已知的这方面的资料可以搜索序列点(Sequence Point)
参数的求值顺序是未指定
printf
序列点(Sequence Point)
1 つのステートメント内で変数を複数回変更することは未定義の動作であり、異なるプラットフォームでは異なる結果が生じる可能性があります。この質問は意味がありません。
printf{"%d",++i}
は2つの操作を意味します最初に i=i+1 を実行し、次に i を出力します
そして i++ は
を意味します最初に出力し、次に i=i+1 を実行します
関数パラメータの演算順序は、関数の内部ロジックとはほとんど関係がありません。スタックにプッシュする前 (関数が実行される前) に計算される必要があります。特定のシーケンスを知りたい場合は、アセンブリコードを参照してください (具体的な意味は明日更新されます、申し訳ありません)
余談:++p
,函数结束后,再计算p++
リーリー結果に表示される 2 と 3 はまだ説明できます。
リーリー4 非常に不思議なことですが、しぶしぶ説明すると、
*(++p)++
の外側の++
もp 動作します
しかし、
p++
の形式の演算子はステートメントの終了後にインクリメントされる必要があるため、この説明は明らかに間違っています。*(++p)++
括号外面的++
也对p
起作用了,但是形如
p++
运算符,应该在语句结束后才自增的,所以这样解释明显不对。我在
Cygwin + gcc (GCC) 5.4.0
Cygwin + gcc (GCC) 5.4.0
環境です。 実行結果は次のとおりです。 使用されている環境は次のとおりです。関数パラメータがスタックにプッシュされる順序は確実です
参数的求值顺序是未指定
的,编译器只保证在
printf
调用之前,所有参数的值是已知的这方面的资料可以搜索
序列点(Sequence Point)