C言語入門|関数呼び出しは値に化ける

戻り値を使った関数呼び出しに慣れてきたころ、
多くの人が一度はこんなところで立ち止まります。

「関数を呼び出して、結果を変数に入れたいだけなのに、
なんだか書き方がピンとこない…」

このモヤっと感の正体は、
関数呼び出しが内部でどう扱われているのか
まだ知らないことにあります。

この節では、
関数呼び出しの正体=値に化ける仕組み
スッと理解できるように解きほぐしていきます。

よくある間違った考え方

まず、ありがちな思考パターンを見てみましょう。

「計算する関数で 80 と 15 を足して、
その結果を変数 result に入れたい」

  1. まずは関数を呼び出す
    → calc(80, 15)
  2. 次に結果を変数に入れる
    → calc(80, 15) = result

この考え方、
気持ちはとてもよくわかります。

でも、これは C言語としては完全に逆 なんです。

正しい書き方は「代入文」

正しい書き方は、こちらです。

result = calc(80, 15);

この1行を見て、

「どうして関数呼び出しが右辺に来るの?」
と感じた人もいるかもしれません。

ここでカギになるのが、
関数呼び出しは値に化ける という考え方です。

関数呼び出しの正体は演算子

実は、関数呼び出しは
演算子の働き によって処理されています。

関数呼び出しの形は、次のとおりです。

要素内容
書式関数名(引数リスト)
正体関数呼び出し演算子
結果戻り値という「値」に化ける。

つまり、

calc(80, 15)

という記述は、

  • 関数を実行し
  • 実行結果の戻り値に変換される。

という動きをしているのです。

( ) は最優先で評価される

関数名の後ろにある ( ) は、
演算子の中でも 最優先 で評価されます。

result = calc(80, 15);

この式には、実は 2つの演算子 があります。

演算子役割
( )関数を実行し、値に化ける。
=右辺の値を左辺に代入する。

評価の流れを図で表すと、次のようになります。

手順処理内容
calc(80, 15) が実行される。
計算結果 95 に化ける。
result = 95 が実行される。

つまり、

result = calc(80, 15);

は、内部的には

result = calc(80, 15);

という ただの代入文 に変身しているわけです。

「代入文」だと考えれば迷わない

こう考えると、
左右を間違える理由がなくなります。

視点理解
左辺値を入れる箱
右辺値に評価される式

関数呼び出しは
右辺に書ける値の一種 なんですね。

関数呼び出しはどこでも使える

関数呼び出しが「値に化ける」とわかると、
次のような書き方も自然に理解できます。

int total = calc(calc(5, 10), calc(20, 30));

この式では、

呼び出し化ける値
calc(5, 10)15
calc(20, 30)50
calc(15, 50)65

すべて 値として評価 されているだけです。

変数に代入しなくてもいい

戻り値は、
必ず変数で受け取らなければならないわけではありません。

printf("結果は%dです\n", calc(40, 2));

この場合も、

  • calc(40, 2) が実行され
  • 戻り値が printf の引数として渡される

という流れになります。

関数呼び出しは、
ただ値に化けているだけ なのです。

まとめ:関数呼び出しは「値そのもの」

ここまでの話を整理しましょう。

ポイント内容
関数呼び出し演算子による評価
結果戻り値という値に化ける
使い方式の中で自由に使える

関数は「命令」ではなく、
値を作る部品 として使える存在です。

この感覚が身につくと、
C言語の式の読み方が一気に楽になりますよ。