Функция strcpy - версия с указателями

Читая книгу Брайана Кернигана по языку программирования Си понравился пример реализации функции strcpy, но немного не понимаю почему второй способ работает без \0

Первый способ мне понятен:

void copy(char *src, char *str)
{
  while ((*s++ = *t++) != '\0')
    ;
}

А вот второй способ без '\0'. Вопрос, как это работает? Почему можно не указывать символ нуля? В книге написано, что '\0' здесь не нужен, оно лишнее, только вот не объяснили почему :) Вопрос почему? Я думал что нужно указать какое-то условие цикла, чтобы мы не выходили за пределы, но если скомпилировать, то все работает как надо. В list копируется строка Hello world без ошибок

void copy(char *src, char *str)
{
  while (*s++ = *t++)
    ;
}

Передача аргументов

int main(void)
{
  char list[100];
  copy(list, "Hello world");
}

Просьба объясните пожалуйста простыми словами. Можно еще по первому способу дать комментарий, заранее спасибо!


Ответы (1 шт):

Автор решения: Harry

Очень простыми словами - чему равно выражение *s++ = *t++? Оно представляет собой присвоенный символ. Значит, пока этот символ не нулевой, будет присваиваться следующий.

А как только скопируется нулевой символ, выражение *s++ = *t++ станет равно нулю, и цикл завершится.

Но нулевой символ будет скопирован.

Так понятно?

В общем случае выражение

a != false

можно заменить на просто a - ведь если a не равно false, то оно преобразуется в true, чему равно и a != false, и проверка излишня.

При a == false проверка дает false - и она опять излишня, ибо a само по себе false!

→ Ссылка