私の古い C コードをリファクタリングしたいのですが、動作を変更せずに、すべてptr++
をポインターのptr += 1
ある場所に置き換えることができるかどうかに興味がありました。ptr
K&R セクション 5.3 から、私が意味することの例を次に示します。
/* strlen: return length of string s*/
int strlen(char *s)
{
int n;
for (n = 0; *s != '\0'; s++)
n++;
return n;
}
を に置き換えるs++
とs += 1
同じ結果が得られますが、これがすべてのタイプに当てはまるかどうかは疑問です。sのテストも行いましたint
:
int size = 10;
int *int_array = (int*)calloc(size, sizeof(int));
for (int i = 0; i < size; i++)
int_array[i] = i;
for (int i = 0; i < size; i++) {
printf("*int_array = %d\n", i, *int_array);
int_array++;
}
int_array++;
行をに置き換えるとint_array += 1;
、同じ結果が得られます。
これについてもう少し考えてみると、値を式で使用すると問題が発生する可能性があることに気付きました。次のようにインクリメントを別の行に移動した方が安全でしょうか。
int a = 5;
int b = a++;
次のようになります。
int a = 5;
int b = a;
a += 1;
結論
問題になる可能性があると思っていたのは、さまざまなタイプのポインターをインクリメントすることですが、問題ではありません。理由については、@bdonlan の応答を参照してください。
x++
これは、すべてを置き換えx += 1
て同じ動作を期待できるという意味ではありません。ただし、これらは同等であるため++x
、安全に置き換えることができます。(x += 1)