関数呼び出しおよび引き数の受け渡し

関数呼び出しの引き数は、関数定義のパラメーターを初期化するために使用されます。 引き数としての配列式および C の関数指定子は、呼び出しの前にポインターに 変換されます。

最初に、整数拡張および浮動小数点拡張が、関数が呼び出される前に、引き数の値に対して行われます。

引き数の型は、関数宣言の対応するパラメーターの型に照らし合わせて検査されます。 可変的に変更されるパラメーターのサイズ式は、関数に入る際に評価されます。必要に応じて、 すべての標準型変換およびユーザー定義の型変換が適用されます。

各引き数式の値は、代入による場合のように、対応するパラメーターの 型に変換されます。

次に例を示します。

#include <stdio.h>
#include <math.h>
 
/* Declaration */
extern double root(double, double);
 
/* Definition */
double root(double value, double base) {
  double temp = exp(log(value)/base);
  return temp;
}
 
int main(void) {
  int value = 144;
  int base = 2;
  printf("The root is: %f¥n", root(value, base));
  return 0;
}

出力は、The root is: 12.000000 となります。

上記の例では、関数 rootdouble 型の引き数を予期していますので、 valuebase の 2 つの int 引き数は、 この関数を呼び出すと、暗黙的に double 型に変換されます。

引き数が評価されて関数に渡される順序は、インプリメンテーションでの定義に依存します。 例えば、以下の一連のステートメントで、関数 tester を呼び出します。

int x;
x = 1;
tester(x++, x);

この例のような tester の呼び出しは、別のコンパイラーでは、異なる結果を生む場合があります。 インプリメンテーションによって、x++ が最初に評価されるか、 または x が最初に評価されるかが決まります。 このようなあいまいさを避けて、x++ が最初に評価されるようにするには、前述の一連のステートメントを次のように置き換えてください。

int x, y;
x = 1;
y = x++;
tester(y, x);

C++このセクションでのここから先の説明は、C++ だけに適用されます。

非静的クラス・メンバー関数を引き数として渡すと、この引き数は メンバーへのポインターに変換されます。

関数仮パラメーターが可変長配列である場合、左端の 次元以外の配列次元は、その関数の多重定義セットを区別します。

クラスに、デストラクターまたはビット単位のコピー以上を行う コピー・コンストラクターがある場合、クラス・オブジェクトを値で渡すと、実際には参照によって渡される一時オブジェクト が構築されます。

関数引き数がクラス・オブジェクトであり、以下の特性のすべてを持っている場合は、エラーです。

関連参照

IBM Copyright 2003