@sddvxd

"Нечитаемый" код?

Добрый день! Делаю задание в учебнике, сказано написать функцию для "переворачивания" строки. Вспомнил про удобный оператор for, вот так можно им злоупотреблять и насколько понятен этот код?

char* rev(const char* str){
    int length = 0;
    const char* pchar = str;
    for(; *pchar; ++length, ++pchar);
    char* new_char = new char[length + 1];
    for(char* pnew_char = new_char; *pnew_char++ = *--pchar;); //pchar == '\0', поэтому префиксный --
    return new_char;
}

int main(int argc, char *argv[])
{
    cout << rev("hello") << '\n';
}
  • Вопрос задан
  • 459 просмотров
Решения вопроса 3
BacCM
@BacCM
C++ почти с рождения
Ну начнем с того, что строку можно перевернуть не выделяя дополнительной памяти. Во вторых возвращать из функции указатель на выделенный блок памяти без лишней необходимости не стоит. Иначе как минимум нужно будет сделать функцию освобождения этого блока.
Что касается циклов. Делать так можно, если никого в команде это не напрягает, но на мой взгляд не нужно. Просто современные компиляторы отлично оптимизируют код, и практической необходимости в подобных упражнениях нет, а ошибиться гораздо легче. Не зря в новые стандарты добавлены циклы по диапазонам и прочие плюшки.
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега C++
software engineer
код плохо читаемый, потому что названия функций и переменных у вас плохо говорят для чего они используются.
А фор - ну технически можно и так.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);

Этот цикл работает неправильно, потому что выход из него происходит по воле случая, в зависимости от мусора, оказавшегося перед строкой, на которую указывает pchar.

for(; *pchar; ++length, ++pchar);

Делать так (писать цикл с пустым телом и точкой с запятой на той же строке) не стоит, потому что легко не заметить эту точку с запятой или её отсутствие.

for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);

Так делать (писать тело цикла в его поле для условия выхода, равно как и писать его в последнем поле) не стоит, потому что всему своё место, а ошибку в этом цикле ты уже допустил.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы