Какая польза от возвращаемого значения strcat()? Иногда стандартные функции - это то, чем они должны быть , а не то, чем они должны быть.
DevSolar 05
4
@MatthieuM .: Кроме того, возврат товара обычно не нулевой. Даже если возвращаемое значение умещается в регистре, вам обычно необходимо загрузить это значение в регистр. Это имеет небольшую цену.
NPE
15
@sharptooth: функция «убить всех людей», конечно же, вернет количество убитых людей.
индив
2
@MatthieuM .: Тебе не стоит беспокоиться о таких мелочах, но я, конечно, могу. Что, если я пишу компилятор для системы с ограниченными ресурсами? Хммм?
Томас Эдинг
Ответы:
36
Подпись соответствует всем другим аналогичным функциям: memcpy() и strcpy()т. Д. Я всегда думал, что это было сделано для того, чтобы можно было связывать вызовы таких функций и иначе использовать такие вызовы в выражениях.
Тем не менее, я никогда не сталкивался с реальной ситуацией, когда я чувствовал бы себя обязанным использовать возвращаемое значение таким образом.
Да, это определенно вариант использования «цепочки».
Cartesius00 05
6
Я поддержал ответ, потому что это интересный случай. Но в реальной жизни я думаю, что лучше держать вызовы memset и strcpy отдельно.
Цветомир Димитров
26
Программисты на C любят нечитаемый код, поэтому при разработке стандартной функции необходимо разрешить бесконечную цепочку.
Чад Шуггинс,
@ChadSchouggins Прочтите код haskell, и вы знаете, что c-программисты на самом деле довольно дословно;) (думает о регулярном выражении "operator" = ~) ...
BitTickler
Конечно, в этом примере было бы даже больше смысла, наоборот, strcpyвозвращать указатель после последнего скопированного. memset(my_strcpy(a, "bla"), 0, a + 200);(нравится std::copy_nи std::fill_nделает в C ++).
alfC
12
Чтобы использовать функцию в качестве аргумента для другой функции, такой как sprintf
strcat()
? Иногда стандартные функции - это то, чем они должны быть , а не то, чем они должны быть.Ответы:
Подпись соответствует всем другим аналогичным функциям:
memcpy()
иstrcpy()
т. Д. Я всегда думал, что это было сделано для того, чтобы можно было связывать вызовы таких функций и иначе использовать такие вызовы в выражениях.Тем не менее, я никогда не сталкивался с реальной ситуацией, когда я чувствовал бы себя обязанным использовать возвращаемое значение таким образом.
источник
Его можно использовать для объединения вызовов, например:
char a[200]; strcpy(memset(a, 0, 200), "bla");
источник
strcpy
возвращать указатель после последнего скопированного.memset(my_strcpy(a, "bla"), 0, a + 200);
(нравитсяstd::copy_n
иstd::fill_n
делает в C ++).Чтобы использовать функцию в качестве аргумента для другой функции, такой как
sprintf
источник
Я столкнулся с этим вопросом, когда погуглил, чтобы узнать, что вернул memset.
У меня есть код, в котором я проверяю одно значение, а затем, если это правда, проверяю, является ли значение нулями.
Поскольку в C нет полностью переносимого способа проверки нулей, мне приходится запускать memset посередине.
Итак, мой код:
if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )
Это говорит о цели связывания, перечисленной в предыдущих вопросах, но это пример использования этой техники.
Я оставлю это на усмотрение других, чтобы судить, хорошее это кодирование или нет.
источник