-1

引数として渡さずに、関数から変数を返すことは可能ですか?例えば:

int example(int x, int y) {
    int z = x + y;
    return z
}

また、メイン機能に戻ったときにこれをどのように使用しますか?

4

4 に答える 4

2

これはC++のような言語にとってはかなり基本的なことです。良い本を手に取って自分自身を助けることを検討してください:
決定的なC++ブックガイドとリスト


引数として渡さずに、関数から変数を返すことは可能ですか?

それは完全に有効です。なぜそうではないと思いますか?
値によって関数にローカル変数を返すことは合法です。変数のコピーが呼び出し元に返されます。
ローカル変数はそれが定義されているスコープ内にのみ存在するため、ローカル変数のアドレスを返すことはすべきではありません。

何を避けるべきですか?

int* example(int x, int y) 
{
    int z = x + y;
    return &z;
}

メイン機能に戻ったときにこれをどのように使用しますか?

int main()
{
    std::cout<<example(4,5);
    return 0;
}
于 2013-01-03T11:54:42.077 に答える
2

それは合法です。

変数zの内容がコピーされます。

int iElsewhere = 0;
iElsewhere = example(1, 2); // now iElsewhere == 3

Kamil Klimekのコメントで述べられているように、この質問は本当に基本的な基本的なC / C ++であるため、C++の小さなチュートリアルまたは紹介を読み始める必要があります。

于 2013-01-03T11:55:06.013 に答える
0

引数以外の変数を返すことができます。以下のコードで問題ありません。

int example(int x, int y) {
    int z = x + y;
    return z;
}

この場合、返す値はintのようなプリミティブ型であるためです。しかし、変数のアドレスを返す場合は複雑なケースがあり、それはすでに天才的な方法で説明されています。

次に、その変数をメインで使用します

int main(){
  int ret = example(4,5);

  //do whatever with ret..
}
于 2013-01-03T11:54:55.967 に答える
0

あなたの例は完全に素晴らしいです。許可されている離散値を返しています。内部で起こっていることは、関数からチップのレジスタの1つに値を返すことができるということです。わかりやすくするために、レジスタをひいきにしないために、通常、OSに応じて32/64ビット値です。

int、bools、floatなどのコアタイプを処理する場合、これらはレジスタに格納されるため、心配することなくこれを返すことができます。

返すことができる他のタイプの情報は、あるメモリへのアドレスのポインタです。これを行うと、戻り値はデータのアドレスにすぎない32/64ビットポインタになります。

実行するときに注意する必要があるのは、関数で実行される割り当てられたメモリが、メソッドで宣言された構造だけでなく、mallocまたはnew(それぞれCまたはC ++を使用する場合)を介して実行されるようにすることです。

たとえば、このようなものは悪いものであり、スタックが上書きされるときに問題が発生します(それがあなたの意図でない限り:))。

void * myfunction(){MYSTRUCT muylocalstructure; void * mypointer =&mylocalstructure; mypointerを返します。}

于 2013-01-03T12:03:44.480 に答える