プロが教える店舗&オフィスのセキュリティ対策術

C言語のこのプログラムでyをどうやって求めるのか分かりません。
y = func( 3*x ) で、yの値が分かるのですよね?
y = func( 3*x ) について詳しく教えてください。3*xはx=3より9であることは分かります。

#include <stdio.h>
int func(int a)
{
int b ;
b = 2*a ;
return 2*b ;
}
int main(void)
{
int x, y ;
x = 3 ;
y = func( 3*x ) ;
printf("x=%d, y=%d\n",x,y) ;
return 0;
}

実行結果は=3,y=36と書いてありました。

A 回答 (5件)

№1と№2でほぼ理解できていると思います。


少しだけ補足します。

このコードは引っ掛け問題のような書き方ですね。
b = 2*a ;
return 2*b ;
見やすくすると下のようになります。
b = 2*2*a ;
return b ;

returnの意味は「???を行って終了」よりも、「???の値を結果として返す」と考えた方がわかりやすいです。
returnで返す値が、func( 3*x )の答えです。
func( 3*x ) = 36 なので、y = func( 3*x ) = 36 です。


これなら見やすいと思います。
#include <stdio.h>

int func_yonbai(int a)
{
int b ;
int kotae ; /* func_yonbai関数の戻り値(計算結果)を代入する */
b = 2*a ;
kotae = 2*b ;
return kotae ; /* kotaeを、func_yonbai関数の結果として返す */
}

int main(void)
{
int x, x_sanbai, y ;
x = 3 ;
x_sanbai = 3*x ; /* 変数x_sanbaiには、変数xの3倍の数を入れる */
y = func_yonbai( x_sanbai ) ;  /* func_yonbai関数を変数x_sanbaiで計算する */
printf("x=%d, y=%d\n",x,y) ;
return 0;
}
    • good
    • 0

何から説明していいかわかりませんが、「項」はわかりますよね、中学校の数学で習った「項」。


C言語の項は、全て数値です。
で、項を使った演算結果も当然数値。

次に、プログラムの実行毎に内容が変化したりとかして、決まった数値じゃないものを一次的に覚えておく必要があるのですが、それが変数。
上記の例だと、a, b, x, yが変数。
変数も、名前を付けているだけで中身は数値。

さらに、関数は中で何やら処理をしていますが、これも呼び出し元から見ると一つの数値。
関数の引数(かっこの中)も数値。

という知識をもとに順を追っていきますが、

x = 3;は、xという名前の変数に3という数値を代入すること(代入も中学校の数学で習っていますよね)。
単独の「=」は代入演算子といって、左辺の変数に右辺の数値を代入する機能があります。
算数の=とは意味が違いますが、C言語(だけでなく多くのプログラミング言語)ではそういう決まりなので、考えても無駄です、そう覚えてください。

y = func( 3*x ) ;は、yに「func(3*x)」という数値を代入すること、これも大丈夫ですね。
func(3*x)は、funcという名前の関数に引数3*xを渡しているのですが、3*xは3という項とxという項を*という演算した結果の数値です。
中学校で習う数学の書き方だと3xという数値、このプログラムではxの値が3なので、9ですね。
つまり、func(3*x)は、func(9)としていることになります。

ここで、関数funcを呼び出しているのですが、funcの先頭にはfunc(int a)とありますね、これは呼び出し元で与えた数値をこの関数の中に限ってはaという変数に代入するという意味です。これも考えても無駄です、そういう決まりです。
関数funcの最後にreturn 2*b;というのがありますが、returnの右に書いた数値が呼び出し元の「func(3*x)」の数値になります。もちろん「2*b」は計算すると一つの数値になりますね。

これだけの情報があれば中間は自分で考えられると思います。
    • good
    • 0

関数を理解するコツの一つは「機能だけに注目して、中身は考えない」ことだと思っています。





z = 3+4 ;
とあったら、 まず 3+4 が計算されて、 7 という値になります。
よって
z = 7 ;
と同じ意味になります。
z = x + 4 ;
でも、x の値に4 足した値が計算され、その計算された値を z に代入します。

それと同じように、 y = func(3 * x) ; は
func(3 * x) を「計算して」、その計算された値を y に代入します。


ここで、関数funcの機能だけを考えます。
関数funcは引数 a を受けとります。

return には2の機能があります。
1つは「関数を終了する」もう一つは「計算結果を指定する」です。
return の後に指定するのは「関数funcの『計算結果』として使いたい値」です。
※ この「『計算結果』として使いたい値」を「戻り値」「返り値」等と呼び、
※ 「(戻り値)を返す」と言った言い回しをします。

中で b=2*a ;で変数bに「aの2倍」の値が代入され、
その後 return 2*b ; で「bの2倍」の値を返します。
これは「『aの2倍』の2倍」であり、つまり「aの4倍」が「関数func『計算結果』」ということになります。

まとめると、 func(???) の計算結果は「???の4倍の値」となります。

これがわかったら、funcの中身は一旦忘れましょう。



funcの機能がわかったところで
y = func(3 * x) ;
に戻ります。
func(3 * x) では、まず 3*x を計算します。x=3なので、 3*x=9 が先に計算され、
y = func(9) ;
ということになります。
func(引数)の計算結果は「引数の4倍」なので、 func(9) は 9の4倍=36 になります。
    • good
    • 1

No.1です。



> 「(=9)が関数funk()に引数として渡されます」のfunc()は→func(int a)のこと
> 引数の変数aでその値を受け取ってその値の2倍の値(=18)を変数bにセット→aが9となって、式はb = 2*aのこと
> 変数bの2倍の値(=36)→return 2*bのこと
>
> で合ってますか?

はい。あっています。
プログラムをきちんと日本語で読むようにされるとよいでしょう。


> リターン値として処理を終了→2*bを行って、終了ということですよね?

そうです。


> returnというのは、return ??? で、???を行って終了。という意味なんですか?

そうです。
教科書などでreturn文の説明をご確認ください。
    • good
    • 0
この回答へのお礼

分かりました。もう一度見てみます。

お礼日時:2020/06/29 14:49

関数func()は関数main()の中から呼び出されています。



呼び出す際、関数main()内で定義している変数x(←初期値3で定義)の値に3を掛けた値(=9)が関数funk()に引数として渡されます。
呼び出された関数func()は引数の変数aでその値を受け取ってその値の2倍の値(=18)を変数bにセットします。そして変数bの2倍の値(=36)をリターン値として処理を終了します。

参考まで。
    • good
    • 2
この回答へのお礼

プログラム上で表す?という表現でいいのか分かりませんが、

「(=9)が関数funk()に引数として渡されます」のfunc()は→func(int a)のこと
引数の変数aでその値を受け取ってその値の2倍の値(=18)を変数bにセット→aが9となって、式はb = 2*aのこと
変数bの2倍の値(=36)→return 2*bのこと

で合ってますか?

リターン値として処理を終了→2*bを行って、終了ということですよね?
returnというのは、return ??? で、???を行って終了。という意味なんですか?
よく、

お礼日時:2020/06/29 14:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!