次の場合に関数呼び出しが行われるとどうなるかを確認してください
1. コンパイラは、呼び出しの前にプロトタイプを検出しました:
各引数の値は、割り当てによるかのように、対応するパラメーターの型に暗黙的に変換されます。
2. コンパイラは、呼び出しの前にプロトタイプを検出していません。
コンパイラはデフォルトの引数昇格を実行します: (1)float
引数は に変換されdouble
ます。(2) 整数昇格が実行され、char
とshort
引数が変換されますint
(C99 では、整数昇格が実行されます)。
だから答えは
E. 各引数は、対応する仮パラメーターの型に変換されます。
ただし、デフォルトのプロモーションに頼るのは危険であることに注意してください。次の例を検討してください。
#include <stdio.h>
int main(void)
{
double x = 3.0;
printf("Square: %d\n", square(x));
return 0;
}
int square(int n)
{
return n*n;
}
が呼び出された時点square
で、コンパイラはまだプロトタイプを認識していないため、 square が type の引数を期待していることを知りませんint
。代わりに、コンパイラは に対してデフォルトの引数昇格を実行しますがx
、効果はありません。型の引数が必要ですが、代わりに値int
が与えられているため、呼び出しの効果はundefinedです。 double
square