第3章の1 基本的な演算子

1. この章で扱う演算子

ここでは、C言語で扱われる基本的な演算子である「代入演算子」「算術演算子」「インクリメント(++)・デクリメント(–)演算子」、そして「関係演算子」と「論理演算子」についてについて説明します。

なお、ビット演算子、複合代入演算子、条件演算子、sizeof演算子については第13章を参照してください。

2. 代入演算子

等号の右側の値を左側の変数に代入します。

  • 定数の代入 : a = 3; ・・・ 変数 a に 定数 3 を代入
  • 変数を代入 : a = b; ・・・ 変数 a に 変数 b を代入
  • 式の代入  : a = c + 4; ・・・ 変数 a に 式「c + 4」を計算して代入
  • 自身を更新 : a = a + 2; ・・・ 変数 a 自身を「+2」して代入

なお、次のような代入はできませんので注意してください。

これらはできません。
1 = a; ・・・ 定数に変数や式は代入できません
a + b = 3; ・・・ 式に定数や変数は代入できません

3. 算術演算子(+ – * / %)

加減乗除および余りを求めます。

演算 演算子 意味
加算 + a + b a に b を加える
減算 a – b a から b を引く
乗算 * a * b a に b をかける
除算 / a / b a を b で割る
剰余算 % a % b a を b で割った余り

%演算子 は整数値で整数値を割る場合にのみ使用されます。浮動小数点数の場合には 「7-3. 算術関数」で扱うfmod()関数を用います。

// %の使用例
int a = 10;
int b = 3;
int c;

c = a % b;    // 10 ÷ 3 の余りは 1 なので c は 1 になる

4. インクリメント(++)・デクリメント(–)演算子

+1 および -1 の演算を行います。

演算 演算子 意味
インクリメント ++ a++ a に 1 を加える(後置演算)
++a a に 1 を加える(前置演算)
デクリメント a– a から 1 を引く(後置演算)
–a a から 1 を引く(前置演算)
  • 前置演算:aの値を使用する前にインクリメントする
  • 後置演算:aの値を使用した後にインクリメントする

インクリメント・デクリメント演算子は単独で、「a++;」や「++a;」のように用いたときには、 後置演算、前置演算のいずれを用いても演算結果は変わりません。

int a = 10;
a++;  // a は 11
int a = 10;
++a;  // a は 11

しかし、次のプログラムのように式中で用いたときには結果が違ってくるので注意してください。

基本演算子の扱い方  サンプルプログラム

#include <stdio.h>

int main(void)
{
    int a = 105, b = 20, c;

    c = a + b;                     // a たす b を計算
    printf("a + b = %d\n", c);     // 出力

    c = a - b;                     // a 引く b を計算
    printf("a - b = %d\n", c);     // 出力

    c = a * b;                     // a かける b を計算
    printf("a * b = %d\n", c);     // 出力

    c = a / b;                     // a 割る b を計算
    printf("a / b = %d\n", c);     // 出力

    c = a % b;                     // a 割る b の余りを計算
    printf("a %% b = %d\n", c);    // 出力(%はエスケープ)

    a = 3;                         // インクリメント演算子(前置演算)の例
    ++a;
    c = ++a;
    printf("前置演算の結果 : a = %d c = %d\n", a, c);

    a = 5;                         // ディクリメント演算子(後置演算)の例
    a--;
    c = a--;
    printf("後置演算の結果 : a = %d c = %d\n", a, c);

    return 0;
}

【実行結果例】
a + b = 125
a – b = 85
a * b = 2100
a / b = 5
a % b = 5
前置演算の結果 : a = 5 c = 5
後置演算の結果 : a = 3 c = 4

printf(“a %% b = %d\n”, c); の % は、文字列中で出力用の % を表すために %% としています(エスケープ処理)。

〇 演習問題

問1

( a + b ) * c / b を計算するプログラムを作りなさい。ただし、a = 5.36、b = 8.47、c = 5.789 とする。
また、計算結果は、
printf( “結果 = %f\n”, 「計算結果が格納されている変数」 );
を用いて画面出力しなさい。

【実行結果例】
結果 = 9.452405

問2

468円の買い物をして1万円札を出したときのお釣りの札と硬貨の枚数をもとめなさい。
また、計算結果は、
printf( “○○の枚数 = %d\n”, 「計算結果が格納されている変数」 );
を用いてそれぞれ画面出力しなさい。

【実行結果例】
五千円札の枚数 = 1
千円札の枚数 = 4
五百円玉の枚数 = 1
百円玉の枚数 = 0
五十円玉の枚数 = 0
十円玉の枚数 = 3
五円玉の枚数 = 0
一円玉の枚数 = 2

解答例

// 問1
#include <stdio.h>

int main( void )
{
    double a = 5.36, b = 8.47, c = 5.789;
    double kekka;

    kekka = ( a + b ) * c / b;

    printf( "結果 = %f\n", kekka );

    return 0;
}
// 問2
#include <stdio.h>

int main( void )
{
    int kingaku = 10000;
    int kaimono = 468;
    int turi, maisu;

    // 五千円札の枚数を求める
    turi = kingaku - kaimono;
    maisu = turi / 5000;
    printf( "五千円札の枚数 = %d\n",maisu );

    // 千円札の枚数を求める
    turi = turi % 5000;
    maisu = turi / 1000;
    printf( "千円札の枚数   = %d\n",maisu );

    // 五百円玉の枚数を求める
    turi = turi % 1000;
    maisu = turi / 500;
    printf( "五百円玉の枚数 = %d\n",maisu );

    // 百円玉の枚数を求める
    turi = turi % 500;
    maisu = turi / 100;
    printf( "百円玉の枚数   = %d\n",maisu );

    // 五十円玉の枚数を求める
    turi = turi % 100;
    maisu = turi / 50;
    printf( "五十円玉の枚数 = %d\n",maisu );

    // 十円玉の枚数を求める
    turi = turi % 50;
    maisu = turi / 10;
    printf( "十円玉の枚数   = %d\n",maisu );

    // 五円玉の枚数を求める
    turi = turi % 10;
    maisu = turi / 5;
    printf( "五円玉の枚数   = %d\n",maisu );

    // 一円玉の枚数を求める
    maisu = turi % 5;
    printf( "一円玉の枚数   = %d\n",maisu );
    
    return 0;
}

コメント