C言語基礎|値を返さないvoid関数

返すのは“値”じゃなくて“仕事”だよ

これまでの章では、max2 みたいに「計算して結果を返す関数」をたくさん見てきましたよね。
でも実際のプログラムでは、値を返さずに“処理だけする関数”もめちゃくちゃ登場します。

たとえば…

  • 画面に表示する(ログを出す)
  • 罫線を描く
  • メニューを表示する
  • エラーメッセージを出して終了する前処理をする

こういう関数は、戻り値で情報を返すより、処理そのものが目的です。
このタイプの関数の返却値型に使うのが void(空っぽ、という意味)です。

void関数って何?(戻り値がない関数)

値を返す関数と返さない関数の違い

種類返却値型呼び出し結果
値を返す関数int / double など関数呼出し式を評価すると値が得られるmax2(3, 5) → 5
値を返さない関数void値は得られない(処理だけ行う)putchar('*')

ポイント
void関数は「値を返さない」ので、呼び出し結果を変数に入れたりはできません。
(入れようとするとコンパイルエラーになります)

サンプルプログラム

元の例は「星で三角形」でしたが、少し違う題材にします。
ここでは 指定した文字で横線を引く関数 を作って、表示に利用します。

  • void draw_line(int n, char ch):文字 ch を n 回表示する
  • main ではそれを使って、見やすい区切り線つきの出力にする

プロジェクト名:chap6-7-1 ソースファイル名:chap6-7-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

// 指定した文字chをn個連続表示する(値を返さない)
void draw_line(int n, char ch)
{
    while (n-- > 0)
        putchar(ch);
}

int main(void)
{
    int width;

    puts("見出し付きの区切り線を表示します。");
    printf("横幅:");
    scanf("%d", &width);

    draw_line(width, '=');
    putchar('\n');

    puts("ここから本文です。");
    puts("表示を整えるために区切り線を使っています。");

    draw_line(width, '-');
    putchar('\n');

    return 0;
}

実行例

見出し付きの区切り線を表示します。
横幅:12
============
ここから本文です。
表示を整えるために区切り線を使っています。
------------

このプログラムで大事なのは、draw_line は値を返さないけど、便利な“部品”として働いているところです。

void関数は“値のパイプ”じゃなくて“作業マシン”

値を返す関数 vs void関数(イメージ)

タイプ入力出力
値を返す関数引数返却値(値が戻る)
void関数引数画面表示・状態変更など(値は戻らない)

今回だと、draw_line は 引数(幅と文字)を受け取って、画面表示という仕事をする関数です。
返却値はありません。

命令の書式と「何をする命令か」の整理

void関数定義の書式

  • void 関数名(仮引数...) { 文; 文; }

例:

  • void draw_line(int n, char ch) { ... }

void関数呼出しの書式

  • 関数名(実引数...);

例:

  • draw_line(width, '=');

return文(voidの場合)

  • return;
  • もしくは return を書かずに関数末尾の } まで到達して終了でもOK

今回のプログラムで登場する命令・記号

名前書式何をする?
putsputs(文字列)文字列を表示して改行する。
printfprintf(書式, 値...)書式付きで表示する。
scanfscanf(書式, 変数のアドレス...)入力を読み込んで変数に格納する。
putcharputchar(文字)文字を1個表示する。
whilewhile(条件) 文条件が真の間、繰り返す。
デクリメントn--nを1減らす(式としては減らす前の値を使う)。
比較n > 0大小比較して真偽を作る。

表の説明(この記事で使ったものを補足)

  • 「値を返す関数と返さない関数の違い」表
    → 返却値型が void かどうかで、関数呼出しの“使い方”が変わることを整理しました。
    値を返す関数は式の中で使えるけど、void関数は「文」として呼び出すのが基本です。
  • 「値を返す関数 vs void関数(イメージ)」
    → 値を返す関数は「入力→計算→値を返す」ですが、void関数は「入力→処理を実行」で終わります。
    返却値という出口がない代わりに、表示や状態変更などの“仕事”が結果になります。

ありがちな注意点(void関数でやりがち)

よくあるミス

ミスどう直す?
void関数の結果を代入しようとするint x = draw_line(5, '*');代入せずに draw_line(5, '*'); と呼ぶ。
void関数を値としてprintfに渡すprintf("%d\n", draw_line(5,'*'));draw_lineを先に呼んで、printfは別にする。
戻り値が欲しいのにvoidにしてしまうvoid sum(int a,int b)値が必要なら int sum(...) にする。

まとめ(ここだけ押さえればOK)

  • 値を返さない関数の返却値型は void
  • void関数は「値」ではなく「処理(仕事)」を提供する部品
  • 呼び出しは基本的に「文」として使う(式の一部にはしない)