Я хотел бы провести рефакторинг своего старого C-кода, и мне было любопытно, смогу ли я заменить все ptr++
на ptr += 1
, где ptr
- некоторый указатель без изменения поведения. Вот пример того, что я имею в виду, из раздела 5.3 K & R:
/* strlen: return length of string s*/
int strlen(char *s)
{
int n;
for (n = 0; *s != '\0'; s++)
n++;
return n;
}
Когда я заменяю s++
на s += 1
, я получаю те же результаты, но мне интересно, будет ли это так для всех типов. Я также сделал тест для int
s:
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)
, поскольку они эквивалентны.