Я бы хотел реорганизовать какой-то старый C-код, и мне было любопытно, могу ли я заменить все ptr++
на ptr += 1
, где ptr
- некоторый указатель, не изменяя никакого поведения. Вот пример того, что я имею в виду, из K & R Section 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
, я получаю те же результаты, но мне интересно, будет ли это иметь место для всех типов. Я также сделал тест для 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)
, так как они эквивалентны.