第14章の2 複雑な演算子

ここでは、複合代入演算子、条件演算子、sizeof演算子を取り上げます。また、演算子の優先順位と結合規則についても説明します。

1. 複合代入演算子

「a = a + b;」のような単純代入演算子を用いた演算は、「a += b;」のように、複合代入演算子を用いた形に書き換えることができます。

【複合代入演算子を使った例】
一般記法による例複合代入演算子を使った例
a = a + b;a += b;
a = a – b;a -= b;
a = a * b;a *= b;
a = a / b;a /= b;
a = a % b;a %= b;
a = a & b;a &= b;
a = a ^ b;a ^= b;
a = a | b;a |= b;
a = a << b;a <<= b;
a = a >> b;a >>= b;

  

2. 条件演算子

条件式を用いて演算をおこなうことができます。これは、

条件式 ? 式1 : 式2

という書式で、条件式が「真」なら「式1」を、「偽」なら「式2」を値とします。
2値の大小関係を比較するプログラムは以下のように書けます。

// 条件演算子で書いた例
int a, b, max;
scanf("%d%d", &a, &b);
max = (a >= b) ? a : b;
printf("max = %d\n", max);
// if文で書いた例
int a, b, max;
scanf("%d%d", &a, &b);
if (a >= b) {
    max = a;
} else {
    max = b;
}
printf("max = %d\n", max);

【実行結果例】
123 45
max = 123

※ 水色字はキーボードからの入力

また、10ごとに改行する例は以下のように書けます。

// 条件演算子で書いた例
for (int i = 1; i <= 30; i++) {
    printf("%2d%c", 
      i, (i % 10)? ' ': '\n');
}
// if文で書いた例
for (int i = 1; i <= 30; i++) {
    printf("%2d", i);
    if ((i % 10) != 0) {
      printf(" ");
    } else {
      printf("\n");
    }
}  

【実行結果例】 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

〇 演習問題

コマンドラインから整数値を入力し、奇数か偶数かを表示するプログラムを作成せよ。
ただし、奇数/偶数の判定は if文ではなく、条件演算子を用いること。

【実行結果例】

解答例

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int a;

    if (argc != 2) {
        printf("引数の数が違います\n");
        return 0;
    }

    a = atoi(argv[1]);
    printf("%d は ", a);
    printf("%s\n", (a % 2) ? "奇数" : "偶数");

    return 0;
}

3. sizeof演算子

(1) 型のサイズを求める

型名(intやdouble)などのデータ型のサイズを求めるときに用います。

sizeof( 型名 )

(2) 式のサイズを求める

式のサイズ ( バイト数 ) を求めるときに用います。

sizeof 式

この場合 () は不要ですが、(1)に合わせ () を付けた方が混乱がありません。

// sizeof演算子の使用例
#include <stdio.h>

int main(void)
{
    char ch[10];
    int data[20];

    printf("char のサイズ : %2d\n", sizeof(char));
    printf("int のサイズ : %2d\n", sizeof(int));
    printf("配列 ch のサイズ : %2d\n", sizeof(ch));
    printf("配列 ch の要素数 : %2d\n", sizeof(ch) / sizeof(ch[0]));
    printf("配列 data のサイズ : %2d\n", sizeof(data));
    printf("配列 data の要素数 : %2d\n", sizeof(data) / sizeof(data[0]));

    return 0;
}

【実行結果例】
char のサイズ : 1
int のサイズ : 4
配列 ch のサイズ : 10
配列 ch の要素数 : 10
配列 data のサイズ : 80
配列 data の要素数 : 20

配列全体のサイズを先頭要素のサイズで割れば、配列の要素数を求めることができます。

4. 演算子の優先順位と結合規則

一つの式の中に複数の演算子が含まれる場合、次のように優先順位と結合規則が決まります。

  • 優先順位: 式中に現れた演算子のどれから先に演算を行うか
  • 結合規則: 式中に現れた演算子の優先順位が同一であった場合に、どの演算子と結合し演算を行うか

優先順位が曖昧な場合は記憶に頼らず、カッコ () を利用しましょう。

【演算子の優先順位と結合規則】
種類演算子結合規則優先順位
関数, 添字, 構造体,
後置増分減分
() [] . -> ++ —左→右


|
|
|
|
|
|
|
|
|
|
|
|
|
|

前置増分減分, 単項式++ — ! ~ + – * & sizeof左←右
キャスト(型)
乗除余* / %左→右
加減+ –
シフト<< >>
比較< ← > >=
等値== !=
ビットAND&
ビットXOR^
ビットOR|
論理AND&&
論理OR||
条件?:左←右
代入= += -= *= /= %= &= ^= |= <← >>=
コンマ,左→右

コメント