34

標準 C ライブラリの多くの関数、特に文字列操作用の関数、特に strcpy() は、次のプロトタイプを共有しています。

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

これらの関数の戻り値は、実際には提供された と同じdestinationです。冗長なものの戻り値を無駄にするのはなぜですか? このような関数は、無効にするか、何か有用なものを返す方が理にかなっています。

これがなぜなのかについての私の唯一の推測は、関数呼び出しを別の式でネストする方が簡単で便利だということです。たとえば、次のようになります。

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

このイディオムを正当化する他の合理的な理由はありますか?

4

6 に答える 6

26

Evanが指摘したように、次のようなことが可能です

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

たとえば、malloc()edヘルパー変数を使用せずにメモリに値を割り当てます。

(この例は最適なものではありません。メモリ不足の状態でクラッシュしますが、考え方は明らかです)

于 2010-08-24T22:16:13.727 に答える
5

あなたの推測は正しいと思います。呼び出しをネストしやすくなります。

于 2010-08-24T22:10:20.900 に答える
1

また、コーディングも非常に簡単です。

戻り値は通常、AXレジスタに残されます(必須ではありませんが、多くの場合そうです)。そして、関数の開始時に宛先がAXレジスタに入れられます。宛先を返すために、プログラマーは何もする必要がありません....まったく何もしません!値をそのままにしておきます。

プログラマーは関数をとして宣言できますvoid。しかし、その戻り値はすでに適切な場所にあり、返されるのを待っているだけであり、それを返すための追加の指示も必要ありません!どんなに小さな改善でも、場合によっては便利です。

于 2010-08-24T22:21:02.123 に答える
0

FluentInterfacesと同じ概念。コードをより速く/読みやすくするだけです。

于 2010-08-24T22:22:00.343 に答える
-2

これは、ネストの目的で実際にこのように設定されているとは思いませんが、エラーチェックのために設定されています。メモリが c 標準ライブラリ関数のいずれも提供しない場合、それ自体で多くのエラー チェックを行うため、strcpy 呼び出し中に何か問題が発生したかどうかを判断することがより理にかなっています。

if(strcpy(dest, source) == NULL) {
  // Something went horribly wrong, now we deal with it
}
于 2016-02-29T13:34:02.327 に答える