これは、kn king の c プログラミング : a modern approach からの質問です。私は彼によって与えられた解決策を理解できません:-
The expression ++i is equivalent to (i += 1). The value of both expressions is i after
the increment has been performed.
とにかくこれをどうやって理解するのですか?
i = 10
printf("%d", i++);
10 を出力します。
printf("%d", ++i);
11を出力します
X = i++
このように考えられます
X = i
i = i + 1
ありのままX = ++i
_
i = i + 1
X = i
それで、
printf ("%d", ++i);
と同じです
printf ("%d", i += 1);
だがしかし
printf ("%d", i++);
ただしi
、これら 3 つのステートメントのいずれの後の の値も同じになります。
解決策とは、差がないという意味であり、表現の文脈に関係なく、たまたま何が起こって++i
も同じ意味を持ちます。括弧で囲まれているため、コンテキストに と等価であるが ( と等価である) と等価ではないなどの追加の算術演算が含まれている場合でも、等価性が保持されます。(i += 1)
i
i += 1
++i * 3
(i += 1) * 3
i += 1 * 3
i += 3
同じことは にも当てはまりませんi++
。これには同じ副作用 ( のインクリメントi
) がありますが、周囲の式の値が異なります —i
インクリメントされる前の の値です。
これまで取り上げられていない違いの 1 つは、コードの読みやすさです。ループの大部分は 1 ずつインクリメントを使用し、次の要素に移動するときやインデックスを 1 ずつインクリメントするときに i++/++i を使用するのが一般的な方法です。
通常、i+= はインクリメントが 1 以外の場合にのみ使用されます。通常のインクリメントにこれを使用しても危険ではありませんが、理解が少し難しくなり、コードが奇妙に見えます。
++i
プリインクリメント演算子です。i
値を設定して返す前にインクリメントします(これは明らかにですi + 1
)。
さて、i++
ポストインクリメント演算子です。i
表示される命令全体が評価された後、インクリメントされます。
例:
int i = 0;
std::cout << ++i << std::endl; /* you get 1 here */
std::cout << i++ << std::endl; /* you still get 1 here */
std::cout << i << std::endl; /* you get 2 here */
割り当てなしの通常の操作では、次のようになります。
++i および i++
変数を 1 増やします。疑似アセンブリの両方のコードでは、次のようになります。
inc i
ただし、値を割り当てる場合、++の順序が関連します:
x = i++
生産:
mov x, i
inc i
x = ++i
生産:
inc i
mov x, i
i += 1の場合
それは生成します:
add i,1
ただし、コンパイラはコードを最適化するため、この場合も生成されます。
inc i