C言語です。実行の順番がよく分かりません。
関数を定義し、引数と戻り値の学習をしていますが。double
関数名(double x, double y)
{
double r;
r = x * y;
return r;
}
これはその一例なのですが、(double x, double y)は何のために宣言したのですか?
x*yが関数だからですか?
コメント(7)
呼び出す側を考えましょう。この場合、
関数名(2.5, 1.8)
という形で呼び出したいわけです。関数を定義するときは、この(2.5, 1.8)を受け取るための受け皿が必要になります。その受け皿が、
(double x, double y)
ということになります。このxとyは、たとえば、mainの中に同じ名前の変数があったとしても、別物として解釈されます。通常、その関数を実行するために外部から与えられなければいけないものは、このような引数でやりとりされます。
でも、関数名(double x, double y)は、x * y;を計算するために定義したのですね。xとyが具体的な数値でないとx * y;を計算できないですよね。
>>#3 xとyが具体的な数値でないとx * y;を計算できないですよね。
関数が呼び出される時、変数の内容として呼び出された時に使われた((実行時の)具体的な)数値が設定(コピーのような感じで)設定されます。
関数の実行前に引数として宣言した変数に引数として渡された値で初期化される。と考えるといいんじゃないですか。
なるほど、関数名の前のdoubleがintでないのは、rが小数になるからですか。
また、rを戻す先であるmain関数をint main と書き、doubleと書かないのはなぜですか。
>>#5 なるほど、関数名の前のdoubleがintでないのは、rが小数になるからですか。
この場合計算結果をdouble(倍精度)で求めているので、関数の返却値である型がdoubleであるのは、自然なことです。
用途によってはint で返す場合もあるかもしれませんが、そういうことは基本精度が失われることになるので、関数側ではなく呼び出し側でします。
>>#5 rを戻す先であるmain関数をint main と書き、doubleと書かないのはなぜですか。
main 関数は、mainの中から呼び出し返値を使うこともできますが、基本はOSから呼び出され(た初期化ルーチンから呼び出され)、OSにプログラムの終了状態を整数(int) で返すことになっています。
OSへの終了状態を表すのにdoubleが必要とは思われにくいと思います。
(OSは、必要以上に資源を使うべきではないのでこの選択は正しいと思います)
規格上はmain 関数は int を返すとなっていますので、double とは書けません。
(例外として返値を設定しない(返値に特に意味を付けない)という意味でvoid を付ける場合があります。OS上はなんらかの値が設定されるはずですが、OSからの管理上の意味(実行がどうだったか)はないことになります。なので返値を設定することが望まれます)
ありがとうございました。



