関数呼び出し は、単純型の名前と括弧で囲まれた引き数リストを含む式です。 引き数リストには、コンマで分離した式をいくつでも 入れることができます。引き数リストは、空にすることもできます。
次に例を示します。
stub() overdue(account, date, amount) notify(name, date + 5) report(error, time, date, ++num)
関数呼び出しには 2 種類あります。 すなわち、通常関数呼び出しと C++ メンバー関数呼び出しです。関数 main を除き、すべての関数は、それ自身を呼び出すことができます。
関数呼び出しの型
関数呼び出し式の型は、その関数の戻りの型です。 この型は、完全型、参照型、または型 void のいずれかです。 関数呼び出しは、関数の型が参照である場合に限って、左辺値です。
関数引き数 は、関数呼び出しの括弧内で使用する式です。 関数仮パラメーター は、関数宣言または定義の括弧内で宣言された、オブジェクトまたは参照です。関数を呼び出すとき、引き数が評価されます。そして各パラメーターが、 対応する引き数の値を使用して初期化されます。 引き数受け渡しのセマンティクスは、代入のセマンティクスと同じです。
関数は、その非 const パラメーターの値を変更できます。 ただし、これらの変更は、パラメーターが参照型でない限り、引き数には影響を及ぼしません。
リンケージおよび関数呼び出し
C では、関数定義
に外部結合と int 型の戻りの型がある場合は、extern int func();
という暗黙の宣言が想定されるので、関数が明示的に宣言される前にその関数を呼び出すことができます。これは、C++ の場合には、あてはまりません。
引き数の型変換
配列または関数である引き数は、関数引き数として渡される前に、ポインターに変換されます。
非プロトタイプ C 関数に渡される引き数は型変換されます。 型 short または char パラメーターは、int に変換され、 float パラメーターは、double に変換されます。 他の型変換の場合は、キャスト式を使用します。
コンパイラーは、呼び出し側の関数によって提供されるデータ型を、 呼び出し先の関数が予想するデータ型と比較し、必要な型変換を行います。 例えば次の例で、関数 funct が呼び出されると、引き数 f は、double に、 引き数 c は、int に変換されます。
char * funct (double d, int i); /* ... */ int main(void) { float f; char c; funct(f, c) /* f is converted to a double, c is converted to an int */ return 0; }
引き数の評価順序
引き数が評価される順序は、規定されていません。 次のような呼び出しは、行わないようにしてください。
method(sample1, batch.process--, batch.process);
この例では、batch.process-- が最後に評価されることもあり、最後の 2 つの引き数が 同じ値で渡されることが生じます。
関数呼び出しの例
次の例では、main から func に、5 および 7 の 2 つの値が 渡されます。 関数 func は、これらの値のコピーを受け取り、ID a と b によって、 それらにアクセスします。 関数 func は、値 a を変更します。 main に制御が戻るときには、x と y の実際の値は、変わっていません。 呼び出し先関数 func は、変数自身ではなく、x と y の値のコピーだけを 受け取ります。
/** ** This example illustrates function calls **/ #include <stdio.h> void func (int a, int b) { a += b; printf("In func, a = %d b = %d¥n", a, b); } int main(void) { int x = 5, y = 7; func(x, y); printf("In main, x = %d y = %d¥n", x, y); return 0; }
このプログラムの出力は次のようになります。
In func, a = 12 b = 7 In main, x = 5 y = 7
関連参照