2017-02-03 4 views

答えて

1

ポストインクリメント/デクリメント演算子が返された後で値を操作するとは、あまり正確ではありません。これらの演算子のセマンティクスは、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のバイトコードでは、変数の現在の値をスタックにプッシュし、(スタックに触れることなく)変数をインクリメントしてから、という式を評価します。


マイナス未定義の動作は、関数呼び出しは、シーケンスポイントを紹介するので

関連する問題