Подтвердить что ты не робот

Значение strcpy() return

Многие функции из стандартной библиотеки C, особенно те, которые используются для обработки строк, и, в частности, strcpy(), используют следующий прототип:

char *the_function (char *destination, ...)

Возвращаемое значение этих функций на самом деле совпадает с возвращаемым значением destination. Зачем вам тратить обратную стоимость на что-то избыточное? Это означает, что такая функция недействительна или возвращает что-то полезное.

Мое единственное предположение, почему это так, проще и удобнее вставить вызов функции в другое выражение, например:

printf("%s\n", strcpy(dst, src));

Есть ли другие разумные причины, чтобы оправдать эту идиому?

4b9b3361

Ответ 1

как указал Эван, можно сделать что-то вроде

char* s = strcpy(malloc(10), "test");

например. присвойте malloc()ed memory значение без использования вспомогательной переменной.

(этот пример не самый лучший, он выйдет из состояния нехватки памяти, но идея очевидна)

Ответ 2

Я считаю, что ваша догадка правильная, это облегчает вложенный вызов.

Ответ 3

Его также очень легко кодировать.

Возвращаемое значение обычно остается в регистре AX (это необязательно, но это часто бывает). И пункт назначения помещается в регистр AX при запуске функции. Чтобы вернуть место назначения, программисту нужно делать... точно ничего! Просто оставьте значение, где оно находится.

Программист может объявить функцию как void. Но это возвращаемое значение уже в нужном месте, просто ожидая возвращения, и даже не требует дополнительной инструкции, чтобы вернуть его! Независимо от того, насколько мало это улучшение, в некоторых случаях это удобно.

Ответ 5

Я не думаю, что это действительно настроено таким образом для целей вложенности, но больше для проверки ошибок. Если память не обслуживает ни одна из стандартных функций библиотеки, они выполняют большую проверку ошибок самостоятельно, и поэтому имеет смысл, что это будет определять, что во время вызова strcpy было что-то не в порядке.

if(strcpy(dest, source) == NULL) {
  // Something went horribly wrong, now we deal with it
}