可能であれば、複数の値を返す方法。コントローラまたはCPUのアキュムレータを介してリターンが行われるため、これはできません。
これが正しい理由ですか?
それが言語の定義方法だからです。根本的な理由はありません。他の言語は複数の値を返すことができます (Matlab など)。
「回避策」として、複数のフィールドを含む構造体を返すことができます。
複数のアイテムを構造体に入れることで完全に「返す」ことができます。または、関数へのポインターを渡して、関数が戻った後も保持される値を関数が書き込むことができるようにします。
一度に複数の値を返すことはできません。関数を返すための構文は、1 つの値のみを受け入れるように定義されているためです。以下の例を確認してください。
a=returnfunction();
上記の場合、関数 returnfunction() が複数の値を返す場合、コンパイラは混乱して、どの戻り値を変数 a に初期化します。関数 returnfunction() が 1 と 2 の 2 つの値を返す場合、コンパイラは値 1 または 2 を変数 a に割り当てるのに混乱します。したがって、この種の問題を防ぐために、関数は複数の値を返さないように定義されています。
表現方法に反して、実際に「返される」値はありません。実際、戻り値/アドレスはスタック上の引数として関数呼び出しに渡されます。次に、return ステートメントが実際にその引数を変更し、結果を呼び出し元に渡します。
ある意味ほぼ似てるvoid func(arg1, arg2, *ret)
異なる言語では、これを異なる方法で処理します。C は、スタック上で 1 つの「戻り」引数のみを想定しています。実際、構造体では複数の値を「返す」ことができるため、構造体へのポインターを通常の引数として渡すこともできます。