プログラミングのコードを記述する際に必ず使用するものの1つに、演算子があります。
今回はその中でも、C言語で使う演算子についてまとめていきたいと思います。
C言語の演算子とは
演算子は、変数や定数に対して計算・比較・代入・論理処理などを行う際に使用する記号のことを言います。
主な演算子の種類は以下の通りです。
- 算術演算子
- 代入演算子
- インクリメント、デクリメント演算子
- 比較演算子
- 論理演算子
- ビット、シフト演算子
基本的な演算子の種類と使い方
まずは、基本的な演算子の用途と種類について、順に説明していきます。
四則演算と剰余算
四則演算や剰余算を行う際に使用するのが、算術演算子です。
主な演算子の種類は以下の通りとなります。
- +… 加算
- – … 減算
- * … 乗算
- / … 徐算
- % … 剰余算
#include <stdio.h>
int main() {
int a, b;
a = 3;
b = 2;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d\n", a / b);
printf("%d\n", a % b);
return 0;
}5
1
6
1
1代入演算子と複合代入演算子の書き方
変数に値を代入する際は、代入演算子を使用します。
また、複合演算子を使用することで、算術演算や、ビット・シフト演算を行った上で代入することができます。
(ビット・シフト演算については後述)
【代入演算子】
- = … 代入
【複合演算子】
- += … 加算して代入
- -= … 減算して代入
- *= … 乗算して代入
- /= … 徐算して代入
- %= … 剰余算して代入
- &= … AND(ビット論理和) の結果を代入
- |= … OR(ビット論理積) の結果を代入
- ^= … XOR(ビット排他的論理和) の結果を代入
- <<= … 左シフトして代入
- >>= … 右シフトして代入
#include <stdio.h>
int main() {
int a;
a = 3;
printf("%d\n", a);
a += 2;
printf("%d\n", a);
return 0;
}3
5インクリメント・デクリメント演算子
インクリメント演算子は値に1を加算し、デクリメント演算子は値から1を減算します。
主に、for文やwhile文などの繰り返し処理を記述する場合などに使用される演算子です。
また、インクリメント演算子とデクリメント演算子は、値の前と後ろのどちらに記述するかで演算するタイミングが変化します。
前置の場合は先に演算をしてから変数に代入し、後置の場合は先に代入をしてから演算が行われます。
- ++ … インクリメント(1加算)
- — … デクリメント(1減算)
#include <stdio.h>
int main() {
int a, b;
a = 2;
b = 2;
printf("%d\n", ++a);
printf("%d\n", --b);
return 0;
}3
1条件分岐を支える比較演算子と論理演算子
条件式を記述する際に主に使用されるのが、比較演算子と論理演算子です。
それぞれの種類ついて見ていきましょう。
値を比較する比較演算子
比較演算子は、2つの値を比較する際に使用する演算子です。
関係演算子とも呼ばれています。
- … aはbより大きい
- >= … aはb以上
- < … aはbより小さい
- <= … aはb以下
- == … aはbと等しい
- != … aはbと等しくない
#include <stdio.h>
int main() {
int a;
a = 10;
printf("%d\n", a > 5);
printf("%d\n", a < 5);
printf("%d\n", a == 10);
printf("%d\n", a != 10);
return 0;
}1
0
1
0複数の条件を組み合わせる論理演算子
複数の条件を組み合わせて真偽を評価したい場合には、論理演算子を使用します。
- ! … NOT(論理否定)
- && … AND(論理積)
- || … OR(論理和)
#include <stdio.h>
int main() {
int a;
a = 10;
printf("%d\n", !(a > 5));
printf("%d\n", a > 5 && a == 10);
printf("%d\n", a < 5 || a == 10);
return 0;
}0
1
1ビット演算の仕組みと活用方法
C言語には、ビット演算と呼ばれる演算手法があります。
ビット演算とは、値を2進数のビット列 (0と1) とみなして論理演算や移動(シフト演算) を行う方法のことを言い、それぞれビット演算子やシフト演算子を用いて記述します。
ビット単位の論理演算
論理演算を行う場合は、以下のビット演算子を使用します。
ビット単位で条件を評価し、その結果に従って0か1かを決定します。
- ~ … NOT(ビット反転)
- & … AND(ビット論理和)
- | … OR(ビット論理積)
- ^ … XOR(ビット排他的論理和)
#include <stdio.h>
int main() {
int a, b;
a = 1; //0001
b = 2; //0010
printf("%d\n", ~a); //1110(正負逆転)
printf("%d\n", a & b); //0000
printf("%d\n", a | b); //0011
printf("%d\n", a ^ b); //0011
return 0;
}-2
0
3
3シフト演算子による倍数計算とフラグ操作
シフト演算は、ビット列の位置を左右に移動することによって演算を行う手法のことを言います。
左に1ビットずらすと値が2倍になり、右に1ビットずらすと2分の1となります。
- << … 左シフト
- >> … 右シフト
#include <stdio.h>
int main() {
int a;
a = 4; //0100
printf("%d\n", a << 1); //1000
printf("%d\n", a >> 1); //0010
return 0;
}8
2演算子の優先順位と結合規則の鉄則
演算子は、1つの式で複数使用されるケースが多々あります。
その場合、優先順位と結合規則によって、記述順とは異なる順番で評価される場合があります。
演算子の優先順位とは
1つの式で複数の演算子がある場合、どの演算子が先に実行されるかは以下のルールによって決められています。
- 演算子はそれぞれ優先度の高い順に評価され、同じ優先度の場合は結合規則によって評価される
- 結合規則は優先順位ごとに決まっており、「左から右」 か 「右から左」のどちらかで評価される
例えば、算術演算子の中では、通常の計算式と同様に乗算(*) と徐算(/) の優先度が高くなっています。
#include <stdio.h>
int main() {
int a, b, c;
a = 10;
b = 2;
c = 3;
printf("%d\n", a + b * c);
return 0;
}16意図しないバグを防ぐための括弧活用
上記のように、優先順位の違いによって記述順と処理順が異なる場合があります。
そのため、意図せぬ順序で式が処理され、エラーや誤動作が発生する原因となることもあります。
このようなケースを防ぐ方法として、「()」を使用して演算子の処理順を変更する方法があります。
対象とする演算や条件部分を () で囲うことで、その式を最優先に処理させることができます。
一例として、先ほどの計算式の処理順を () で変更してみます。
#include <stdio.h>
int main() {
int a, b, c;
a = 10;
b = 2;
c = 3;
printf("%d\n", (a + b) * c);
return 0;
}36このように、() を使用することで処理する順番を変更することができます。
特殊な演算子:三項演算子、sizeof、キャスト演算子
上述した演算子の他に、特殊な演算子がいくつかあります。
主なものは以下の通りです。
【三項演算子 】
if-else文に相当する条件分岐を、一行で完結に記述することができる演算子です。
使用する際は、以下の形式で記述します。
条件式 ? 真の場合 : 偽の場合#include <stdio.h>
int main() {
int a, b, max;
a = 5;
b = 10;
max = (a > b) ? a : b;
printf("%d\n", max);
return 0;
}10【sizeof演算子 】
変数やデータ型のメモリサイズを調べる際に使用する演算子です。
対象とする変数やデータ型のメモリサイズを、バイト単位で取得することができます。
主に、配列の要素数を調べる場合などに使用されます。
#include <stdio.h>
int main() {
int a;
a = 5;
printf("%zu\n", sizeof(a));
return 0;
}4【キャスト演算子 】
データ型の変換を行うための演算子です。
変換したい変数の左側に、データ型を「()」で囲んで記述することで変換できます。
#include <stdio.h>
int main() {
int a;
a = 5;
printf("%d\n", a);
printf("%f\n", (double)a);
return 0;
}5
5.000000まとめ
上述のように、演算子の種類は多岐に渡るため、一度に全てを覚えるのは大変です。
覚える際は、実際のコードと絡めて記述しながら覚えていくといいでしょう。
C言語の勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、C言語に限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。