C言語には基本的な計算を行う算術演算子があります。
その他にも、比較演算子、論理演算子、ビット演算子などもあります。
この記事では、演算子について
・演算子一覧
・算術演算子
・比較演算子
・代入演算子
・インクリメントとデクリメント演算子
・論理演算子
・短絡演算子
・ビット演算子
という基本的な内容から、
・sizeof演算子
・キャスト演算子
・演算子の優先順位
などの応用的な使い方に関しても解説していきます。
演算子一覧
C言語の演算子には多くの種類があります。
表にしましたので、確認してみましょう。
演算子の種類 | 記号 |
---|---|
算術演算子 | +, -, *, /, % |
比較演算子 | >, >=, <, <=, ==, != |
代入演算子 | =, +=, -=, *=, /=, %= |
インクリメント・デクリメント演算子 | ++, –- |
条件演算子 | |, &, !, ||, && |
シフト演算子 | <<, >> |
では早速、それぞれの演算子について説明していきます!
算術演算子
算術演算子とは、足し算、引き算、掛け算、割り算、余りを求めるための演算子の総称です。
算術演算子について表にまとめました。
記号 | 説明 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 余り |
C言語では、足し算は”+”、引き算は”-”、掛け算は”*”、割り算は”/”、余りは”%”で表記されます。
特に掛け算・割り算・余りの求め方は我々が習ってきた数学の記号とは若干違うので、しっかり覚えておきましょう。
算術演算子の基本的な使い方を見ていきましょう。
#include<stdio.h> int main(void) { int num1, num2, ans; num1 = 5; num2 = 2; // 足し算 ans = num1 + num2; printf("足し算:%d\n", ans); // 引き算 ans = num1 - num2; printf("引き算:%d\n", ans); // 掛け算 ans = num1 * num2; printf("掛け算:%d\n", ans); // 割り算 ans = num1 / num2; printf("割り算:%d\n", ans); // 余り ans = num1 % num2; printf("余 り:%d\n", ans); return 0; }
実行結果:
足し算:7 引き算:3 掛け算:10 割り算:2 余 り:1
num1とnum2の計算結果を変数ansにそれぞれ代入し、結果を出力するプログラムです。
注意してほしい点は、割り算です。
5を2で割ると2.5ではないの? と思われるかもしれませんが、num1とnum2そしてansはint型の整数を使っているので、小数点以下は切り捨てられ表示されません。
何度も繰り返しますが、掛け算、割り算、余りの表記はしっかり覚えておきましょう。
比較演算子
よく使う基本的な演算子について見てみましょう。
演算子 | 読み | 書き方 | 説明 |
---|---|---|---|
> | 大なり | a > b | aはbより大きい |
>= | 大なりイコール | a >= b | aはb以上 |
< | 小なり | a < b | aはbよりも小さい |
<= | 小なりイコール | a <= b | aはb以下 |
== | イコール | a == b | aとbは同じ |
!= | ノットイコール | a != b | aとbは同じでない |
比較演算子の詳しい使い方については、こちらで解説しているので参考にしてくださいね。
代入演算子
代入演算子は変数に値を代入する際に用います。
代入演算子について下記の表にまとめました。
記号 | 説明 |
---|---|
= | 代入 |
+= | 加算して代入 |
-= | 減算して代入 |
*= | 乗算して代入 |
/= | 除算して代入 |
%= | 剰余して代入 |
それではサンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int foo = 0; // 代入 foo = 5; // 代入 // foo = foo + 3; と同じ意味 foo += 3; printf("foo : %d\n", foo); return 0; }
実行結果:
foo : 8
このサンプルコードでは、最初のfooを定義した段階で変数の値を初期化するために「=」が使われています。
この「=」が代入演算子になります。
その後に変数fooに対して5を代入しています。
また、足し算をして代入する場合により短く書ける「+=」を使っています。
インクリメントとデクリメント演算子
C言語では、算術演算子の他に特殊な数値の計算方法があります。
ここでは、インクリメントとデクリメントを理解していきましょう。
インクリメントは、値を1増やすことを意味し、逆にデクリメントは値を1減らすことを意味します。
表記は、以下のようになります。
// インクリメント x++; ++x; // デクリメント x--; --x;
x++(後置)と++x(前置)は計算結果が違ってきます。
これについては、後程記載いたします。
実際にインクリメントとデクリメントのプログラムを動かしてみましょう。
#include<stdio.h> int main(void) { int num1, num2; num1 = 5; num2 = 2; num1++; // num1 = num1 + 1 num2--; // num2 = num2 - 1 printf("インクリメント:%d\n", num1); printf("デクリメント :%d", num2); return 0; }
実行結果:
インクリメント:6 デクリメント :1
上記のプログラムでは、num1をインクリメント、num2をデクリメントしています。
変数の後にプラスを持ってくるインクリメントの表記は、非常によく使うのでしっかりと理解しておきましょう。
x++(後置)と++x(前置)の違いについて
インクリメントとデクリメントに『x++』『++x』と2種類の表記がありますが、計算させてみると若干結果が違ってきます。
結果がどう違うのかプログラムで確かめてみましょう。
#include<stdio.h> int main(void) { int num, ans1, ans2; // numの後ろに++ num = 0; ans1 = num++; printf("num++:%d\n", ans1); // numの前に++ num = 0; ans2 = ++num; printf("++num:%d", ans2); return 0; }
実行結果:
num++:0 ++num:1
上記のプログラムでは、ans1にnum1++、ans2に++numを代入しています。
結果部分でもわかる通り、前者は0、後者は1と出ています。
ans1ではまずans1にnumの0が入り、それから「num = num + 1」を計算しています。
そしてans2では、「num = num + 1」が計算されてからans2にnumの1が入ります。
よって、num++と++numではnumが+1されるタイミングが異なることにより上記のプログラムのように結果が違ってきます。
条件演算子
論理演算子
論理演算子には3種類あります。
記号 | 名前 | 説明 |
---|---|---|
& | ビット論理積 | ANDを返す |
| | ビット論理和 | ORを返す |
^ | ビット排他的論理和 | XORを返す |
それではサンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int foo = 1; int bar = 3; int result = 0; // 論理和(OR) result = foo | bar; printf("result = %d\n", result); // 論理積(AND) result = foo & bar; printf("result = %d\n", result); // 排他的論理和(XOR) result = foo ^ bar; printf("result = %d\n", result); return 0; }
実行結果:
result = 3 result = 1 result = 2
このサンプルコードでは、まず1番目に変数fooと変数barの論理和の結果は3となるため変数resultは3が入ります。
次に2番目は論理積になるので結果は1となり変数resultには1が入ります。
3番目は変数fooと変数barの1ビット目が両方1であるため排他的論理和の場合は0になります。
その結果、変数resultには2が入ることになります。
短絡演算子
短絡演算子には3種類あります。
記号 | 名前 | 説明 |
---|---|---|
|| | 論理和 | どちらかの条件が成立すれば真 |
&& | 論理積 | 条件が両方成立すれば真 |
! | 否定 | 真のとき偽。偽のとき真。 |
それではサンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int foo = 1; int bar = 2; if(foo == 1 || bar == 1) { printf("TEST1:TRUE\n"); } if(foo == 1 && bar == 1) { printf("TEST2:TRUE\n"); } int baz = 1; if(!baz) { printf("TEST3:TRUE\n"); } return 0; }
実行結果:
TEST1:TRUE
このサンプルコードでは、まず1番目に変数fooの中身が1もしくは変数barの中身が1である場合は真となりブロック内({})にあるprintfを実行しています。
次に2番目は偽(false)となりTRUEという文字は表示されません。
左辺の式と右辺の式の条件を両方共満たす必要がありどちらか一方の条件が満たされていない場合は、もう片方が条件を満たしていたとしても偽となりブロック内({})に入ることはありません。
3番目はbazがfooがtrueであればTRUEと表示されるはずですが今回はif文中の変数fooの前に「!」がついています。
bazが1(true)である場合は偽(false)となりますので、TRUEという文字は表示されません。
ビット演算子
ビット演算子とは、ビットを計算させるための演算子です。
我々が計算するときに思い浮かべる足し算の⁺などのようなものです。
ビット演算子では少し特殊なので順番に見ていきましょう。
ビット演算子の種類 | |
---|---|
& | AND。両方1のときに1、それ以外は0にする演算子 |
| | OR。両方0のときのみ0。それ以外は1にする演算子 |
^ | XOR。両方が異なる値の時に1。それ以外は0にする演算子。 |
~ | NOT。0は1、1は0に反転させる演算子。 |
>> | シフト演算で右へずらす。10進数で言う桁移動のようなもので、すべてのビットの桁を移動する。符号を考慮するかしないかで演算の方法が異なる。 |
<< | シフト演算で左へずらす。 |
ビット演算子については、こちらで詳しく解説していますので、ぜひ参考にしてください。
sizeof演算子
sizeof演算子とは、変数や型のメモリサイズを調べるための演算子です。
sizeof演算子は、変数や型のメモリサイズをバイト単位で返してくれます。
メモリサイズとはコンピュータが使用するメモリの大きさのことです。
sizeof演算子は、配列の要素数を調べる場合などで使われます。
sizeof演算子の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
キャスト演算子
型の変換を行うことをキャストといいます。
例えば、int型の変数をdouble型の変数として使う場合などに、キャストを行います。
キャストは以下のように記述します。
(型名)式
キャスト演算子の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
演算子の優先順位
演算子には優先順位という考え方があります。
まず、プログラムが処理を行う場合は原則的に左から右という流れがありますが、代入演算子を用いた式を評価(処理)する場合は右辺が優先されます。
そして、算数と同じく「+」や「-」よりも「*」や「/」の方が優先順が高いため先に計算される仕組みになっています。
優先順位について下記の表にまとめました。
優先順位 | 演算子 | 名前 |
---|---|---|
1 | ++, -- | 後置インクリメント, 後置デクリメント |
2 | !, ++, -- | 論理否定, 前置インクリメント, 前置デクリメント |
3 | *, /, % | 乗算, 除算, 剰余 |
4 | +, - | 加算, 減算 |
5 | <<, >> | 左シフト, 右シフト |
6 | >, >=, <, <= | より大きい, 以上, より小さい, 以下 |
7 | ==, != | 等価, 非等価 |
8 | & | ビット論理積 |
9 | ^ | ビット排他的論理和 |
10 | | | ビット論理和 |
11 | && | 論理積 |
12 | || | 論理和 |
それではサンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int foo = 0; foo += 5 + 2 * 4 / 3; printf("foo = %d\n", foo); return 0; }
実行結果:
foo = 7
このサンプルコードの場合、2*4が先に行われます。
次にその結果である8と3の除算が行われたあとに5を加算しその合計値をfooに加算するといった計算式になります。
このあたりの優先順位についてはとても細かく決められているため複雑な計算式を作る際は注意が必要です。
ちなみに、極力複雑な計算式を作る様な状況は避けるべきですが・・・
まとめ
ここでは、演算子について解説してきましたがいかがだったでしょうか?
よく使う演算子からあまり使わない演算子まで一通り解説をしてきました。
ちょっと長い記事になりましたが忘れてしまったときには、この記事を思い出して頂ければすぐに復習できるかと思います!