今日、私は2人の友人にC struct
の使い方を教えていました。それらの1つはstruct
、関数からを返すことができるかどうかを尋ねましたが、「いいえ!代わりに、動的にmalloc
編集されたstruct
s へのポインターを返します。」
主にC ++を行う人から来て、struct
値でs を返すことができないと思っていました。C ++ではoperator =
、オブジェクトのをオーバーロードでき、値によってオブジェクトを返す関数を持つことは完全に理にかなっています。ただし、Cではそのオプションがないため、コンパイラーが実際に何をしているのかを考えさせられました。以下を検討してください。
struct MyObj{
double x, y;
};
struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
int main () {
struct MyObj a;
a = foo(); // This DOES work
struct b = a; // This does not work
return 0;
}
なぜstruct b = a;
動作しないのか理解しています- operator =
データ型のオーバーロードはできません。a = foo();
うまくコンパイルできるのはなぜですか?それ以外の意味struct b = a;
ですか?多分尋ねるべき質問は次のとおりです:署名return
に関連する声明は正確に何を=
しますか?
[編集]:さて、指摘されたのstruct b = a
は構文エラーです-それは正しいです、私はばかです!しかし、それはそれをさらに複雑にします!使用struct MyObj b = a
は確かに機能します!ここで何が欠けていますか?
struct MyObj b = a;
機能するようです:)
struct b = a;
構文エラーです。あなたがしようとした場合はどうなりますstruct MyObj b = a;
か?