Функция 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 шт):
Очень простыми словами - чему равно выражение *s++ = *t++? Оно представляет собой присвоенный символ. Значит, пока этот символ не нулевой, будет присваиваться следующий.
А как только скопируется нулевой символ, выражение *s++ = *t++ станет равно нулю, и цикл завершится.
Но нулевой символ будет скопирован.
Так понятно?
В общем случае выражение
a != false
можно заменить на просто a - ведь если a не равно false, то оно преобразуется в true, чему равно и a != false, и проверка излишня.
При a == false проверка дает false - и она опять излишня, ибо a само по себе false!