Apa gunanya nilai kembali strcat()? Terkadang, fungsi standar adalah apa yang ditentukan, bukan apa yang seharusnya .
DevSolar
4
@MatthieuM .: Selain itu, biasanya ada biaya tidak nol yang terkait dengan pengembalian barang. Meskipun nilai yang dikembalikan cocok dengan register, Anda biasanya perlu memuat nilai itu ke register. Ini memiliki biaya, betapapun kecilnya.
NPE
15
@sharptooth: Fungsi "bunuh semua manusia" akan mengembalikan jumlah manusia yang terbunuh, tentu saja.
indiv
2
@ MatthieuM .: Anda tidak akan khawatir tentang hal-hal sepele seperti itu, tetapi saya pasti mungkin. Bagaimana jika saya menulis kompiler untuk sistem sumber daya terbatas? Hmmm?
Thomas Eding
Jawaban:
36
Tanda tangan ini sejalan dengan semua fungsi serupa lainnya: memcpy(), strcpy()dll Saya selalu berpikir ini dilakukan untuk memungkinkan seseorang untuk panggilan rantai untuk fungsi tersebut, dan untuk sebaliknya menggunakan panggilan tersebut dalam ekspresi.
Meskipun demikian, saya tidak pernah menemukan situasi dunia nyata di mana saya merasa harus menggunakan nilai pengembalian dengan cara seperti itu.
Ya, ini jelas merupakan kasus penggunaan 'rantai'.
Cartesius00
6
Saya telah memilih jawabannya, karena ini kasus yang menarik. Namun dalam kehidupan nyata, saya pikir lebih baik memisahkan panggilan memset dan strcpy.
Tsvetomir Dimitrov
26
Pemrogram C menyukai kode yang tidak dapat dibaca, jadi mengizinkan rangkaian tanpa batas adalah suatu keharusan saat mendesain fungsi standar.
Chad Schouggins
@ChadSchouggins Baca beberapa kode haskell dan Anda tahu bahwa c-programmer sebenarnya cukup kata demi kata;) (pikirkan regex "operator" = ~) ...
BitTickler
Tentu saja dalam contoh ini akan lebih masuk akal bahkan, sebaliknya, untuk strcpymengembalikan penunjuk melewati yang terakhir disalin. memset(my_strcpy(a, "bla"), 0, a + 200);(suka std::copy_ndan std::fill_nlakukan di C ++).
alfC
12
Untuk menggunakan fungsi tersebut sebagai argumen untuk fungsi lain seperti sprintf
strcat()
? Terkadang, fungsi standar adalah apa yang ditentukan, bukan apa yang seharusnya .Jawaban:
Tanda tangan ini sejalan dengan semua fungsi serupa lainnya:
memcpy()
,strcpy()
dll Saya selalu berpikir ini dilakukan untuk memungkinkan seseorang untuk panggilan rantai untuk fungsi tersebut, dan untuk sebaliknya menggunakan panggilan tersebut dalam ekspresi.Meskipun demikian, saya tidak pernah menemukan situasi dunia nyata di mana saya merasa harus menggunakan nilai pengembalian dengan cara seperti itu.
sumber
Ini dapat digunakan untuk rantai panggilan seperti:
char a[200]; strcpy(memset(a, 0, 200), "bla");
sumber
strcpy
mengembalikan penunjuk melewati yang terakhir disalin.memset(my_strcpy(a, "bla"), 0, a + 200);
(sukastd::copy_n
danstd::fill_n
lakukan di C ++).Untuk menggunakan fungsi tersebut sebagai argumen untuk fungsi lain seperti
sprintf
sumber
Saya menemukan pertanyaan ini ketika Googling untuk melihat memset apa yang dikembalikan.
Saya memiliki beberapa kode di mana saya menguji satu nilai, kemudian jika itu adalah tes yang benar untuk melihat apakah nilainya nol.
Karena tidak ada cara yang sepenuhnya portabel di C untuk menguji nol, saya harus menjalankan memset di tengah.
Jadi kode saya adalah:
if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )
Ini berbicara tentang tujuan rangkaian yang tercantum dalam pertanyaan sebelumnya, tetapi ini adalah contoh penggunaan teknik ini.
Saya akan menyerahkan kepada orang lain untuk menilai apakah ini pengkodean yang baik atau tidak.
sumber