関数呼び出しの引き数は、関数定義のパラメーターを初期化するために使用されます。 引き数としての配列式および 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 となります。
上記の例では、関数 root は double 型の引き数を予期していますので、 value と base の 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++ だけに適用されます。
非静的クラス・メンバー関数を引き数として渡すと、この引き数は メンバーへのポインターに変換されます。
関数仮パラメーターが可変長配列である場合、左端の 次元以外の配列次元は、その関数の多重定義セットを区別します。
クラスに、デストラクターまたはビット単位のコピー以上を行う コピー・コンストラクターがある場合、クラス・オブジェクトを値で渡すと、実際には参照によって渡される一時オブジェクト が構築されます。
関数引き数がクラス・オブジェクトであり、以下の特性のすべてを持っている場合は、エラーです。
関連参照