2

私は最近 C++ を学び始めましたが、関数の宣言と呼び出しに至るまでは、これまでのところ順調に進んでいました。私が正確に理解していないreturnのは、その目的と、すべての機能がそれを必要とする理由です。

また、なぜ関数型が必要なのですか? 例えば

int xamplefunc(){}

int 型とは何ですか?

編集:まあ、私はそれを得るかどうかわかりません. return は具体的に何をするのですか?カーテンの後ろで実際に何が起こっているのですか?呼び出し元の関数は戻り値を変数として保存しますか?それとも何ですか?

4

9 に答える 9

3

そのような

return_type  function_name(parameter list)
  {    
     //body of the function     
  } 

return_type は、関数が返すデータのタイプを指定します。return_type は void にすることができます。これは、関数がデータ型を返さないことを意味します。function_name は関数の名前です。関数の名前は、アルファベットまたはアンダースコアで始める必要があります。パラメーター リストは、コンマで区切られた変数とそのデータ型で構成されます。パラメーター リストが空である可能性があります。これは、関数にパラメーターが含まれていないことを意味します。パラメーター リストには、変数のデータ型と名前の両方を含める必要があります。

例えば、

 int factorial(int n, float j)

よく読んだ

@DeadMg http://www.wide-language.com/cpptuts/functions.htmlによるように

于 2012-09-23T10:15:17.473 に答える
3

数学で関数がどのように定義されているかを覚えておくと役立つかもしれません。関数 f(x) は引数 x を取り、x から計算できる値を返します。たとえば、関数 sin は実数を取り、その数値のサインである別の実数を返します。

C++ 関数はこれのモデルです。そのため、関数を定義するときは、関数が受け取る型の引数 (これは括弧内の引数リストです) と関数が返す値の型 (これは呼び出した戻り値の型です) の両方をコンパイラに伝える必要があります。上記の「関数型」; C++ では、「関数型」という用語は別のものに使用されることに注意してください)。

したがって、C++ で正弦を計算する関数を作成する場合は、次のようにします。

double sin(double x)
{
  // code to calculate the sine of x
}

ただし、ここで別の問題が発生します。通常、関数を単一の式として記述する数学とは異なり、C++ では、実行するステートメントのリストを記述します。そのステートメントのリストは通常​​、多くの値を操作します。では、どの値が実際に x のサインとして返されるべきかをコンパイラーにどのように伝えるのでしょうか?

これに対する答えはreturn声明です。したがって、関数は次のようになります。

double sin(double x)
{
  double result = 0;
  // code to modify result so finally it contains the sine of x
  return result;
}

ただし、returnコンパイラに「これが返す結果です」と伝えるだけでなく、「このステートメントに到達したら、終了し、今すぐ呼び出し元に戻る」ことにも注意してください。

たとえば、特別な処理を使用して NaN と無限値を検出する次のコードを考えてみましょう (簡単にするために、関数is_badgetnanはこの目的のために書かれていると仮定します)。

double sin(double x)
{
  if (is_bad(x))
    return getnan(); // when this is executed, the function *immediately* returns
  // if we get here, we therefore know the value x is a regular number
  double result;
  // calculate the sine
  return result;
}

呼び出し時に実行したいが、値を返す必要のないコードを書きたい場合があります。他の一部の言語では、これに別の構文を使用していますが、C++ は、型を導入するだけでこの違いをモデル化しています。そのタイプはvoid. その場合、returnとにかく返すものが何もないため、明示的なステートメントは必要ありません。例えば:

void say_hello()
{
  std::cout << "Hello!\n";
}

ただし、returnステートメントは早期返品にも役立つ可能性があることに注意してください。そのため、その場合にも使用できます。

void say_hello(std::string to_whom)
{
  if (to_whom = "satan")
    return; // I don't say hello to satan!
  std::cout << "Hello " << to_whom << "!\n";
}

最後に、main関数についてのコメント: これには の必須の戻り値もありintます。その戻り値を使用して、プログラムの呼び出し元に、プログラムが正常に終了したかエラーが発生したかを伝えます。だからあなたは書くことができます(で定義された定数を使用して<cstdlib>

int main()
{
  return EXIT_SUCCESS; // I've succeeded in doing nothing!
}

また

int main()
{
  return EXIT_FAILURE; // I have no idea what I was supposed to do,
                       // so I couldn't do it :-)
}

EXIT_SUCCESS代わりに、成功を示すために戻ることもできることに注意してください0(実際、通常EXIT_SUCCESSは値が だけです0

main他の値を返す関数とは異なり、returnステートメントを省略できるという追加のルールが追加されました。return 0;これを行うと、関数の最後に記述した場合と同じ効果が得られます。

于 2012-09-23T13:27:10.520 に答える
2

関数の「型」と呼ばれるものは、関数の戻り値の型です。これは、関数の呼び出しがその型のオブジェクトを返すことを意味します。return ステートメントは、関数が返す場所です。

int random() {
  return 4;
}

この関数は を返しますint。これを呼び出して、値を int に割り当てることができます。

int n = random();
于 2012-09-23T10:13:52.113 に答える
2

あなたは銀行システムを持っています。ユーザーが残高をリクエストできるようにします。getCurrentBalance メソッドを実装します。メソッド本体で計算したら、残高を返すために戻り値の型が必要になります。入力パラメーターも必要です。アカウント番号はおそらく次のとおりです。

double getCurrentBalance (int AccountNo)
{
   double balance = //Check balance for AccountNo in Database or whereever
   return balance; 
}

私が使用したタイプをあまり調べないでください。double が現在最適ではないことはわかっています。

return balance; 

これは、戻り値の型、つまり doubleと一致する必要があります。ただし、暗黙的に double にキャストされたものに戻ることはできます。必要に応じて int バランスを返すこともできます (もちろん精度は失われます)。

于 2012-09-23T10:20:31.397 に答える
1

関数を呼び出すときに、何かを取得したい場合があります。たとえば、単純な計算 (2x2) を実行する関数を呼び出すことができ、その答えが必要です。答えを返す方法がない場合は、あらゆる種類の回避策に頼る必要があります。

あなたが「関数型」と呼んだものは、実際には関数から得られると期待される答えの型です。あなたの場合、関数が int 型の値 (数値など) を返すことが期待されます。

xamplefunc が次のように定義されている場合:

int xamplefunc(){
    return 2*2;
}

関数を呼び出すと、4 が返されることが期待されます。

于 2012-09-23T10:21:43.160 に答える
1

指定された型の変数の を知るために、 をコンパイラに認識させる必要があります。これは、return type最適割り当てを行うためだけでなく、読み書きするのに最適な変数です。bitsizeregistersinfer the memory addressesaddress intervals

関数は値を返さない場合があります (void)。値を返す場合、関数の呼び出し元がその値を取得できる必要があります。

呼び出された関数は、その戻り値を、呼び出し元関数が認識しており、呼び出し元関数がアクセスできなければならない場所に置きます。戻り値は、ret命令が実行される前にメモリに格納されます。

例えば。次の関数があるとします。

int xamplefunc(int x, int y)
{
   return x + y;
}

MSVC コンパイラを使用して x86 マシンでアセンブルすると、次のことが行われます。

:_xamplefunc@8
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret 8

またはx86 マシン上のLLVM経由:

define i32 @xamplefunc(i32 %x, i32 %y) nounwind uwtable readnone {
  %1 = add nsw i32 %y, %x
  ret i32 %1
}

: 使用される順序とレジスタは、コンパイラとバージョンによって異なる場合があります。これは、ソフトウェア フォレンジックに役立つプロパティです。

一部の言語 (Coffeescript など) は、関数宣言内の最後の宣言の値を返すことにより、暗黙的な戻り値も提供します。

于 2012-09-23T10:55:22.817 に答える
0
int xamplefunc(){}

int型の値を返し、何も受け取らない関数。が存在しないため、このコードは正しくありreturnません。コンパイル エラーがなければ、ゴミが返されます。

于 2012-09-23T10:14:26.257 に答える
0

いくつかの操作を行った後、計算された新しい値を関数の呼び出し元に返す必要があることがよくあります。2 つの数値を加算して呼び出し元に加算を返したい場合、次のように関数を記述できます。

int add(int x,int y)
{
return X+y;
}

ここでreturnステートメントは、int値を返すことを示しています。
何も返したくない場合は、次のように戻り値の型 void を使用するだけです

void add(int x,int y)
{
//some statements;
}
于 2012-09-23T10:17:05.470 に答える
0

Function 型は、適切に言うとreturn 型です。あなたの例では指定された型を返すため、そう呼ばれています

     int xamplefunc(){}

整数が返されます...

詳細な説明については、次のリンクを確認してください http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/

于 2012-09-23T10:19:13.530 に答える