C言語基礎|複数の変換指定と単項演算子

ここまでの内容では、1つの値を表示したり、1つの値を読み込んだりするプログラムを作ってきました。
しかし実際のプログラムでは、複数の計算結果をまとめて表示したい場面 や、値を加工して表示したい場面 が数多くあります。

この記事では、

  • printf 関数で 複数の変換指定を使う方法
  • オペランドが 1 個だけの 単項演算子

について学習します。
どちらも、プログラムを簡潔に書くためにとても重要な考え方です。

複数の変換指定を使った表示

まずは、二つの整数値を読み込み、
平均との差と平均との差の絶対的な大きさ を同時に表示するプログラムを見てみましょう。

サンプルプログラム

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

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

// 二つの整数値を読み込んで差とその符号反転値を表示
#include <stdio.h>

int main(void)
{
    int p, q;

    puts("二つの整数を入力してください。");
    printf("整数 p:"); scanf("%d", &p);
    printf("整数 q:"); scanf("%d", &q);

    printf("pとqの差は%d、その符号を反転すると%dです。\n",
           p - q, -(p - q));

    return 0;
}

実行例

二つの整数を入力してください。
整数 p:80
整数 q:55
pとqの差は25、その符号を反転すると-25です。

複数の変換指定の対応関係

この printf 呼び出しでは、書式文字列に %d が2つ 含まれています。

printf("pとqの差は%d、その符号を反転すると%dです。\n",
       p - q, -(p - q));
書式文字列中の変換指定対応する実引数
最初の %dp - q
次の %d-(p - q)

重要なルール
変換指定は、左から順番に実引数へ対応 します。
この順番が崩れることはありません。

scanf 関数での複数変換指定

scanf 関数でも、複数の変換指定を使うことができます。

scanf("%d%d", &p, &q);

この場合、

  • 1つ目の整数 → p
  • 2つ目の整数 → q

という順序で読み込まれます。

入力時は、次のいずれかで区切ります。

  • スペース
  • タブ
  • 改行
80 55

80
55

どちらでも正しく読み込めます。

演習問題

演習 2-2

二つの整数値を読み込み、
平均との差と平均との差の2倍の値 を表示するプログラムを作成せよ。

実行例

二つの整数を入力してください。
整数 a:40
整数 b:18
差は22、差の2倍は44です。

解答例

プロジェクト名:chap2-3-2 ソースファイル名:chap2-3-2.c

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

#include <stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。");
    printf("整数 a:"); scanf("%d", &a);
    printf("整数 b:"); scanf("%d", &b);

    printf("差は%d、差の2倍は%dです。\n", a - b, 2 * (a - b));

    return 0;
}

単項演算子とは

ここまでに使ってきた + や -、* などは、
2つの値を対象にする演算子 でした。

このような演算子は 2項演算子 と呼ばれます。

それに対して、値を1つだけ扱う演算子 も存在します。
それが 単項演算子 です。

単項 + 演算子と単項 − 演算子

次のプログラムでは、読み込んだ整数と、
符号を反転した値・絶対的な大きさ を同時に表示します。

サンプルプログラム

プロジェクト名:chap2-3-3 ソースファイル名:chap2-3-3.c

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

// 整数値と符号反転値・元の値を表示
#include <stdio.h>

int main(void)
{
    int n;

    printf("整数を入力してください:");
    scanf("%d", &n);

    printf("入力値は%d、符号反転は%dです。\n", +n, -n);

    return 0;
}

実行例

整数を入力してください:12
入力値は12、符号反転は-12です。

整数を入力してください:-9
入力値は-9、符号反転は9です。

単項演算子の意味

演算子書式意味
単項 ++aa の値そのもの
単項 −-aa の符号を反転した値

単項 + 演算子は 実質的に何も変えません
そのため、

+n

n

と同じ意味になります。

一方、単項 − 演算子は、符号を反転した新しい値を生成 します。

演算子の種類を整理しよう

種類オペランド数
単項演算子1個-a, +a
2項演算子2個a + b, a * b
3項演算子3個条件 ? 真 : 偽

この記事では、
複数の値を一度に表示する方法
単項演算子による値の扱い方 を解説しました。