💬

前置インクリメントと後置インクリメント

2021/01/23に公開
#include <stdio.h>

int main() {
    char str[] = "peace";
    char *s = str;
    printf("%s", ++s);
}

この出力は eace

一方で

#include <stdio.h>

int main() {
    char str[] = "peace";
    char *s = str;
    printf("%s", s++);
}

この場合は、出力はpeace

前置インクリメントと後置インクリメント

どちらも、変数の値を1だけ増加させるという点は共通しているが、インクリメント演算子による演算に他の処理を組み合わせた時に異なる挙動を見せる。

前置インクリメントでは、インクリメントする変数の前にインクリメント演算子を記述する。インクリメント演算の結果を別の変数に割り当てる場合、前置インクリメントでは、インクリメント後に割り当てが起こる。

 i = 1;
 j = ++i;

そのため、実行結果としては、i = 2j = 2となる。

一方、拘置インクリメントでは、割当てのあとにインクリメントが計算される。

 i = 1;
 j = i++;

実行結果としては、i = 2j = 1となる。

先のコードをみてみよう。

#include <stdio.h>

int main() {
    char str[] = "peace";
    char *s = str;
    printf("%s", s++);
}

上記のコードの場合、s++が計算される前にprintf関数に評価される。そのため、strがstoreする文字列peace全体が表示される。

一方、++sとかくと、インクリメント後のポインタが1足されたsprintf関数に評価される。よって、eaceが表示される。

参考

Post Increment(i++)とPre Increment(++i)

Discussion