Значение strcpy() return
Многие функции из стандартной библиотеки C, особенно те, которые используются для обработки строк, и, в частности, strcpy(), используют следующий прототип:
char *the_function (char *destination, ...)
Возвращаемое значение этих функций на самом деле совпадает с возвращаемым значением destination
. Зачем вам тратить обратную стоимость на что-то избыточное? Это означает, что такая функция недействительна или возвращает что-то полезное.
Мое единственное предположение, почему это так, проще и удобнее вставить вызов функции в другое выражение, например:
printf("%s\n", strcpy(dst, src));
Есть ли другие разумные причины, чтобы оправдать эту идиому?
Ответы
Ответ 1
как указал Эван, можно сделать что-то вроде
char* s = strcpy(malloc(10), "test");
например. присвойте malloc()ed
memory значение без использования вспомогательной переменной.
(этот пример не самый лучший, он выйдет из состояния нехватки памяти, но идея очевидна)
Ответ 2
Я считаю, что ваша догадка правильная, это облегчает вложенный вызов.
Ответ 3
Его также очень легко кодировать.
Возвращаемое значение обычно остается в регистре AX (это необязательно, но это часто бывает). И пункт назначения помещается в регистр AX при запуске функции.
Чтобы вернуть место назначения, программисту нужно делать... точно ничего! Просто оставьте значение, где оно находится.
Программист может объявить функцию как void
. Но это возвращаемое значение уже в нужном месте, просто ожидая возвращения, и даже не требует дополнительной инструкции, чтобы вернуть его! Независимо от того, насколько мало это улучшение, в некоторых случаях это удобно.
Ответ 4
Такое же понятие, как Свободные интерфейсы. Просто сделать код быстрее/проще для чтения.
Ответ 5
Я не думаю, что это действительно настроено таким образом для целей вложенности, но больше для проверки ошибок. Если память не обслуживает ни одна из стандартных функций библиотеки, они выполняют большую проверку ошибок самостоятельно, и поэтому имеет смысл, что это будет определять, что во время вызова strcpy было что-то не в порядке.
if(strcpy(dest, source) == NULL) {
// Something went horribly wrong, now we deal with it
}