🍣

C言語のあれこれ5(計算するための演算子の説明)

に公開
2

はじめに

以下の記事の続きになります。

C言語のあれこれ1(Hello Worldの解読)

C言語のあれこれ2(変数と定数の作成方法)

C言語のあれこれ3(基本的な値型の種類と構造体の作成方法)

C言語のあれこれ4(関数の作成方法)

以下の順番で作成していきます。

追記

モチベーションが続いているうちに作り切ってしまおうと考えたため、連投します。

本編

ここでは変数や値の計算を行うための記号に関して記述します

演算を行うための記号

記号を読むにあたって次の知識が前提となります。

左辺 記号 右辺

こちらの記号に関しては特に値を代入するものに限ります。

=

右辺にある値を左辺に入れるための記号です。
ここには2つの内容があります。

この値を入れる行動を代入と言います。
この時、左辺が定数やマジックナンバー(値をコード上に直接書くこと)だった場合はエラーが起こります。

宣言時に値を入れる場合は初期化と言います。

    int a = -1;
    int b = 2;

用意された変数に値を入れる場合は代入と言います。
この時、左辺が定数やマジックナンバー(値をコード上に直接書くこと)だった場合はエラーが起こります。

    a = -1;
    b = 2;
+

こちらは単純に a の値と b の値の足し算を行います。

    a = a + b;
+=

こちらは a + b を行った後に a に結果を代入する命令になります。

    a += b;
++

こちらは a + 1 を行った後に a に結果を代入する命令になります。

    a++;

++aa++では若干動きが異なります。特に後で説明する繰り返し文での利用時に動きが変わるため注意が必要です。

-

こちらは a の値から b の値の引き算を行います。

    a = a - b;
-=

こちらは a - b を行った後に a に結果を代入する命令になります。

    a -= b;
--

こちらは a - 1 を行った後に a に結果を代入する命令になります。

    a--;

※こちらも--aa--では若干動きが異なります。特に後で説明する繰り返し文での利用時に動きが変わるため注意が必要です。

*

こちらは a の値と b の値の掛け算を行います。

    a = a * b;
*=

こちらは a * b を行った後に a に結果を代入する命令になります。

    a *= b;
/

こちらは a の値から b の値で割り算を行います。この時b側に入る値が0の場合はNanなどわからない数値が入るため注意が必要です。

    a = a / b;
/=

こちらは a / b を行った後に a に結果を代入する命令になります。

    a /= b;
%

こちらは a の値から b の値で割り算を行った余りを出します。この時b側に入る値が0の場合はNanなどわからない数値が入るため注意が必要です。

    a = a % b;
%=

こちらは a % b を行った後に a に結果を代入する命令になります。

    a %= b;

特殊な命令

ここからはあまり見ない内容になります。
bitを操作するための演算子です。

シフト演算子

シフト演算子は対象のビットを移動させるための演算子になります。

例えば次の1バイトに対して2bit分左にシフトさせると次のようになります
00001000 => 00100000
8 => 32

このようにbitを移動させることで中の値を変更することができます。
これを行う命令がシフト演算子になります。

<<

こちらはaの値をbitで見て左に指定した数分bitをずらす命令になります。

    a = a << 2;
<<=

こちらはa << 2を行ってからaに結果を代入する命令になります。

    a <<= 2;
>>

こちらはaの値をbitで見て右に指定した数分bitをずらす命令になります。

    a = a >> 2;
>>=

こちらはa >> 2を行ってからaに結果を代入する命令になります。

    a >>= 2;
&

ビットAND
処理の動きは次のようになります。

11111111 & 10101010 => 10101010

これは11111111の値と10101010の値で1の部分が重なった場所だけが結果として出力される計算を行ってくれます。

例では5を指定していますが、別の値でも問題ありません。

    a = a & 5;
&=

こちらはa & 5を行ってからaに結果を代入する命令になります。

例では5を指定していますが、別の値でも問題ありません。

    a &= 5;
|

ビットOR
処理の動きは次のようになります。

11111111 | 10101010 => 11111111

これは11111111の値と10101010の値で1のある部分すべてが結果として出力される計算を行ってくれます。

例では255を指定していますが、別の値でも問題ありません。

    a = a | 255;
|=

こちらはa | 255を行ってからaに結果を代入する命令になります。

例では255を指定していますが、別の値でも問題ありません。

    a |= 255;
^

ビットXOR
処理の動きは次のようになります。

10011001 ^ 10101010 => 00110011

これは10011001の値と10101010の値で同じ高さにあるbitの部分が違う部分を正としたが結果として出力される計算を行ってくれます。

例では3を指定していますが、別の値でも問題ありません。

    a = a ^ 3;
^=

こちらはa ^ 3を行ってからaに結果を代入する命令になります。

例では3を指定していますが、別の値でも問題ありません。

     ^= 3;

上記の記号や条件を記述するための記号には優先順位があります。(例えば + の計算より*の計算が先に行われるなど)
すべてを記述すると時間がかかるため、URLを記述します。
https://learn.microsoft.com/ja-jp/cpp/c-language/precedence-and-order-of-evaluation?view=msvc-170

これらの記号は()をつけることで優先順位を変更することができます。
例:(a + b) * c => aとbを足したものにcを掛けた結果を得られます。

例で()を利用しない場合、つまりa + b * c とするとbとcを掛けたものにaを足した結果を得られます。

Discussion

齊藤敦志齊藤敦志
int a = -1;

このときの = は宣言の文法の一部で、初期化を意味します。 代入の = とは違います。

Chronoss0518Chronoss0518

コメントしていただきありがとうございます。
初期化時のコンストラクタのことが抜け落ちていました。

こちらの文は修正させていただきます。