
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
今回のプログラムで登場する命令・記号
| 名前 | 書式 | 何をする? |
|---|---|---|
| puts | puts(文字列) | 文字列を表示して改行する。 |
| printf | printf(書式, 値...) | 書式付きで表示する。 |
| scanf | scanf(書式, 変数のアドレス...) | 入力を読み込んで変数に格納する。 |
| putchar | putchar(文字) | 文字を1個表示する。 |
| while | while(条件) 文 | 条件が真の間、繰り返す。 |
| デクリメント | 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関数は「値」ではなく「処理(仕事)」を提供する部品
- 呼び出しは基本的に「文」として使う(式の一部にはしない)
