私は、ポストインクリメントまたはポストデクリメント操作をjavaやC++などのプログラミング言語で実行するための内部機能について知りたいと思います。ポストインクリメント演算子の内部動作は何ですか?
私は、何か(関数、メソッド...)が値を返してから、その後に操作を実行することができますか?
私は、ポストインクリメントまたはポストデクリメント操作をjavaやC++などのプログラミング言語で実行するための内部機能について知りたいと思います。ポストインクリメント演算子の内部動作は何ですか?
私は、何か(関数、メソッド...)が値を返してから、その後に操作を実行することができますか?
ポストインクリメント/デクリメント演算子が返された後で値を操作するとは、あまり正確ではありません。これらの演算子のセマンティクスは、Java、C++、およびおそらくはそのような演算子を持つ他のすべての言語で定義されているため、値を変更してから古い値を戻すというものです。
私たちは、このような正確に模倣++
の動作をC++の関数を定義できます。生成されたアセンブリの面では
int post_inc(int& x) {
int old_x = x;
x = x + 1;
return old_x;
}
、ポストインクリメントを実装するための最も直接的な方法は、(変数を仮定しレジスタ内に存在する)は、第2のレジスタにそれをコピーし、第1のレジスタをインクリメントし、次にx++
が使用された式で第2のレジスタを使用することである。インクリメント後に最初のレジスタからメモリに書き戻されます。
多くの場合、最適化コンパイラは、式の後に1つのレジスタを1つだけ使用するようにコードを並べ替えます(ただし、すべての場合で可能です - たとえば変数自体同じ式で使用されます(CまたはC++では未定義の動作を禁止します))。
Javaのバイトコードでは、変数の現在の値をスタックにプッシュし、(スタックに触れることなく)変数をインクリメントしてから、という式を評価します。
マイナス未定義の動作は、関数呼び出しは、シーケンスポイントを紹介するので