C/C++言語のprintf関数でポインタの指す配列の値を出力する場合、なぜこのようにポインタの値が変化するのでしょうか?
大家讲道理
大家讲道理 2017-06-27 09:18:57
0
4
1571

1. prinf 関数のパラメーターにはポインター式が含まれていますが、それらはどのような順序で計算されますか? コード操作の結果は明らかに左から右ではありません。

リーリー

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(4)
给我你的怀抱

1 つのステートメント内で変数を複数回変更することは未定義の動作であり、異なるプラットフォームでは異なる結果が生じる可能性があります。この質問は意味がありません。

いいねを押す +0
学习ing

printf{"%d",++i}は2つの操作を意味します

最初に i=i+1 を実行し、次に i を出力します

そして i++ は

を意味します

最初に出力し、次に i=i+1 を実行します

いいねを押す +0
某草草

関数パラメータの演算順序は、関数の内部ロジックとはほとんど関係がありません。スタックにプッシュする前 (関数が実行される前) に計算される必要があります。特定のシーケンスを知りたい場合は、アセンブリコードを参照してください (具体的な意味は明日更新されます、申し訳ありません) ++p,函数结束后,再计算p++ リーリー

余談:

結果に表示される 2 と 3 はまだ説明できます。
4 非常に不思議なことですが、しぶしぶ説明すると、*(++p)++ の外側の ++p 動作します
しかし、p++ の形式の演算子はステートメントの終了後にインクリメントされる必要があるため、この説明は明らかに間違っています。 *(++p)++括号外面的++也对p起作用了,
但是形如p++运算符,应该在语句结束后才自增的,所以这样解释明显不对。
我在Cygwin + gcc (GCC) 5.4.0 Cygwin + gcc (GCC) 5.4.0 環境です。 実行結果は次のとおりです。 使用されている環境は次のとおりです。

リーリー
いいねを押す +0
ringa_lee

関数パラメータがスタックにプッシュされる順序は確実です参数的求值顺序是未指定的,
编译器只保证在printf调用之前,所有参数的值是已知的
这方面的资料可以搜索序列点(Sequence Point)

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート