C LANGUAGE TECHNOLOGY

【C言語】演算子とは

悩んでいる人

C言語の演算子を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

演算子

演算子とは,データとデータを結びつけて何らかの演算をするための記号です.

演算子の存在はC言語に限ったことではなく,プログラミング言語であれば必ずあります.

演算子がないとプログラミングができませんからね...

C言語には,特に多くの演算子があります.

C言語の演算子の一覧は以下になりますので,それぞれ解説していきます.

  • 算術演算子
  • 等値演算子と関係演算子
  • 論理演算子
  • インクリメント演算子とデクリメント演算子
  • ビット演算子とシフト演算子
  • 代入演算子
  • 3項演算子(条件演算子)
  • カンマ演算子
  • キャスト演算子
  • sizeof演算子
  • ポインタ演算子

算術演算子

算術演算子は,多くのプログラミング言語に存在する演算子です.

それだけに多くの言語で似たような記号になっています.

下表に示すように,C言語では四則演算(足し算,引き算,掛け算,割り算)と剰余(余り),正符号と負符号の7個の算術演算子が定義されています.(足し算と正符号は両方とも+を利用します.)

記号説明式の例
+足し算a = b + c
-引き算a = b - c
*掛け算a = b * c
/割り算a = b / c
%剰余(余り)a = b % c
+正符号a = +b
-負符号a = -b

剰余は,剰余演算子(%)の符号の注意点で詳しく解説しているので,興味があるあなたはこちらも読みましょう!

C言語 剰余
【C言語】剰余演算子(%)の符号の注意点

こういった悩みにお答えします. こういった私から学べます. 目次1 剰余演算子(%)2 剰余演算子(%)の符号の注意点:is_odd関数で解説3 剰余演算子の間違った使い方4 剰余演算子の正しい使い方 ...

続きを見る

PythonやRubyにある「べき乗演算子(**)」はありませんので注意して下さい.

C言語のべき乗の方法を知りたいあなたは,pow関数と自作関数でべき乗,累乗,2乗の計算を読みましょう.

C言語 べき乗
【C言語】pow関数と自作関数でべき乗,累乗,2乗の計算

こういった悩みにお答えします. こういった私から学べます. 目次1 べき乗,累乗,2乗とは1.1 2乗の自作コード1.2 累乗の自作コード1.3 べき乗の自作コード2 pow関数でべき乗の計算3 自作 ...

続きを見る

算術演算は,他の言語と同様に特に難しいことはありません.

ただし,C言語には変数の型というものがあります.

算術演算時に異なる型を混在させると規則に従った暗黙的な型変換が行われます.

詳細を知りたいあなたは,キャスト演算子で明示的な型変換【暗黙的な型変換も紹介】を読みましょう.

C言語 キャスト
【C言語】キャスト演算子で明示的な型変換【暗黙的な型変換も紹介】

こういった悩みにお答えします. こういった私から学べます. 目次1 キャスト演算子【明示的な型変換】1.1 キャスト演算子でオーバーフローの回避1.2 キャスト演算子で汎用ポインタ型(void *)か ...

続きを見る

等値演算子と関係演算子

等値演算子(==,!=)は式と式の等値関係を評価し,関係演算子(<,<=,>,>=)は大小関係を評価するために利用されます

これらの演算子は優先順位が異なるため,別々の名前が付いています.

具体的には,関係演算子の方が等値演算子よりも優先順位が高くなっています.

等値演算子は下表になります.

演算子意味
==
左辺と右辺が等しい時に真
!=
左辺と右辺が等しくない時に真

関係演算子は下表になります.

演算子意味
<左辺の方が右辺より小さい時に真
<=左辺が右辺以下の時に真
>左辺の方が右辺より大きい時に真
>=左辺が右辺以上の時に真

また,C言語の真偽値は,下表のように0であるかないかという整数値で決まります.

したがって,等値演算子や関係演算子の演算においても,偽ならばその式の値が0になり,真ならば0以外の値になります.

真偽値(整数型)
0以外の値
0

ここで注意してほしいのは,等しいかどうかを比較するときには==という記号を利用するということです.

=という記号に間違えてしまう傾向にあります.

==の部分を=にしても文法的には間違いではなく,ただの代入文になります.

なので,コンパイル時にエラーにならないので注意して下さい.

GCC/Clangでは,if文等の条件式で==を間違えて=と書いてコンパイルした時に,以下の警告メッセージを表示します.

  • GCC:warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  • Clang:warning: using the result of an assignment as a condition without parentheses [-Wparentheses]

日本語訳は「条件式ではカッコを付けましょう」という意味ですが,==を間違えて=と書いてしまった時に表示されるメッセージです.

デバッグに有用なので覚えておきましょう.

実行結果は以下になります.

論理演算子

論理演算子は,主に関係演算子等を利用した式を複数組み合わせる時に利用します.

論理演算子を下表に示します.

記号説明
!論理否定
&&論理積
||論理和

論理演算子を利用するコードは以下になります.

実行結果は以下になります.

インクリメント演算子とデクリメント演算子

インクリメント演算子は値を1増やす,デクリメント演算子は値を1減らす演算子です.

ここで,インクリメントは増加する,デクリメントは減少するという意味です.

以下のように,for文等で値を1増やす,または1減らすという処理を書きたい時がありますよね.

C言語ではこのような操作を簡単に記述するために,インクリメント演算子とデクリメント演算子という専用の演算子を導入しています.

インクリメント演算子とデクリメント演算子は下表になります.

記号意味式の例
++1を増やす++a a++
--1を減らす--a a--

まず,これらの演算子の使い方を説明します.

以下の3つの文は同じ意味になります.

上記の++aを前置インクリメント(pre-increment),a++を後置インクリメント(post-increment)と呼びます.

同様に,以下の3つの文は同じ意味になります.

上記の--aを前置インクリメント(pre-decrement),a--を後置インクリメント(post-decrement)と呼びます.

式の値自体を参照しない単純な計算では,前置型と後置型のいずれを利用しても同じ結果になります.

しかし,以下のように式の値を参照する場合では両者の意味が異なりますので注意して下さい.

上記の違いを以下のコードで示します.

実行結果は以下になります.

これらの代入文は,一般的には以下のように記述できます.

インクリメント,デクリメント一般的な記述
b = ++a;
a = a + 1;
b = a;
b = a++;b = a;
a = a + 1;
b = --a;a = a - 1;
b = a;
b = a--;b = a;
a = a - 1;

一般的な記述をすると上記のように2つの文になってしまいます.

そこで,インクリメント演算子とデクリメント演算子を利用することで,a[i++]やb[--j]等のように式しか記述できない部分に記述できます.

ビット演算子とシフト演算子

ビット演算子とシフト演算子は,こちらの記事で深堀りしています.

C言語 ビット演算子 シフト演算子
【C言語】ビット演算子とシフト演算子の使い方

こういった悩みにお答えします. こういった私から学べます. 目次1 ビット演算子2 &:ビット毎のAND(論理積)3 |:ビット毎のOR(論理和)4 ^:ビット毎のXOR(排他的論理和)5 ~ ...

続きを見る

代入演算子

代入演算子は,変数に(演算結果を含む)値を代入するために利用される演算子です.

実際のコードでは,以下のように自分自身に何かの演算をするという記述がよく出てきます.

この例では,1つの式の中で同じ変数が2度出てきます.

また,変数名が長いと以下のようになります.

こうするとキー入力も大変ですし,間違える(タイポする)可能性が高くなります.

そこで,C言語では簡単に記述できる代入演算子が用意されています.

上記の文は,以下のように書くことができます.

これならタイプ数が減り,間違える可能性が低くなります.これが代入演算子のメリットです.

代入演算子の一覧を下表に示します.もちろん,たたの=も代入演算子の一つです.

記号式の例一般記述法
=a = ba = b
+=a += ba = a + b
-=a -= ba = a – b
*=a *= ba = a * b
/=a /= ba = a / b
%=a %= ba = a % b
&=a &= ba = a & b
|=a |= ba = a | b
^=a ^= ba = a ^ b
<<=a <<= ba = a << b
>>=a >>= ba = a >> b

このように,代入演算子は演算と代入を1度にできる便利な演算子ですが,注意点があります.

例えば「+=」という演算子は,「+ =」と余分なスペースを入れてはいけません.

これは代入演算子だけでなく,>=,<=,==,!=,&&,||,++,--,<<,>>等の演算子も余分なスペースを入れてはいけません.

また,以下の2つの文は同じ意味になります.

「a = a / b – 10;」とはならないので,注意して下さい.

つまり,以下の2つの文は同じ意味になります.

3項演算子(条件演算子)

3項演算子(条件演算子)はif文のような使い方をします.

例えば,以下のように利用されます.

3項演算子は,次のように3つの項をとります.

まず式1が評価され,それが真ならば式2,偽ならば式3がこの式全体の値になります.

これが,3項演算子と呼ばれる理由です.

先の例ではxがyより大きい時はxが式の値となり,そうでないときにはyが式の値になり,aに代入されます.

3項演算子を利用したコード例は以下になります.

実行結果は以下になります.

3項演算子は,式しか記述できない部分で比較したい場合に効果的です.

例えば,配列の添字でa[(x > y) ? x : y]のような使い方も可能です.

カンマ演算子

カンマ演算子を利用すると,本来1つしか式を記述できない部分に複数の式を記述することができます.

例えば,以下の文があったとします.

上記の2つの文は,カンマ演算子を利用することで以下の1つの文で記述できます.

カンマ演算子は,左から右に実行され,評価されます.

そして最後に評価(実行)された式が全体の式の値になります.

例えば,以下の文では,最初にaに1が代入され,次にbに2が代入されます.

そして,カッコの式の値は2になり,その式の値(2)がxに代入されます.

カンマ演算子の説明をするために,以下のようなコードで考えてみましょう.

このコードでは,for文の実行に先立って,変数sumを0にmulを1に初期化しています.

カンマ演算子を利用すれば,この初期化の文をfor文の中に取り込んで,コンパクトに記述できます.(代入演算子も利用しています.)

また,以下の例では,while文の条件式にカンマ演算子を利用して2つの式を記述しています.

まず,scanf関数でiに値を入力します.

次に,そのiが10未満の場合にwhile文の条件式は真になり,while文の中身を実行します.

iが10以上の場合はwhile文条件式が偽になるので,while文の中身を実行せずに次の処理に進みます.

キャスト演算子

キャスト演算子を知りたいあなたは,キャスト演算子で明示的な型変換【暗黙的な型変換も紹介】を読みましょう.

C言語 キャスト
【C言語】キャスト演算子で明示的な型変換【暗黙的な型変換も紹介】

こういった悩みにお答えします. こういった私から学べます. 目次1 キャスト演算子【明示的な型変換】1.1 キャスト演算子でオーバーフローの回避1.2 キャスト演算子で汎用ポインタ型(void *)か ...

続きを見る

sizeof演算子

sizeof演算子を知りたいあなたは,sizeof演算子の使い方を読みましょう.

C言語 sizeof演算子
【C言語】sizeof演算子の使い方

こういった悩みにお答えします. こういった私から学べます. 目次1 sizeof演算子2 sizeof演算子でデータ型のサイズの計算3 sizeof演算子で変数のサイズの計算4 sizeof演算子でポ ...

続きを見る

ポインタ演算子

ポインタ演算子を知りたいあなたは,ポインタとはを読みましょう.

C言語 ポインタ
【C言語】ポインタとは

こういった悩みにお答えします. こういった私から学べます. 目次1 ポインタ2 ポインタ変数2.1 ポインタ演算子の使い方2.2 ポインタ変数を利用するコード3 ポインタと関数の引数:値渡しと参照渡し ...

続きを見る

まとめ

C言語の演算子を紹介しました.

C言語には多くの演算子がありますので,正しく理解してシンプルで読みやすいコードを書けるように使いこなしましょう.

演算子の優先順位と結合規則を知りたいあなたは,こちらの記事を読みましょう.

C言語 演算子の優先順位 結合規則
【C言語】演算子の優先順位と結合規則

こういった悩みにお答えします. こういった私から学べます. 目次1 演算子の優先順位と結合規則2 演算子に関する記事3 まとめ 演算子の優先順位と結合規則 数学の式に優先順位があるのと同様に,C言語の ...

続きを見る

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール3社で自分に合うスクールを見つけましょう.

-C LANGUAGE, TECHNOLOGY
-, ,