C#の演算子を完全理解|算術・比較・論理演算の使い方と優先順位を初心者向けに解説
はじめに
C#でプログラムを書くとき、ほぼ必ず使うのが「演算子」です。
たとえば、数値を足す、値を比較する、条件を組み合わせる、変数に値を代入する、といった処理はすべて演算子を使って書きます。
C#int total = 100 + 50;
bool isAdult = age >= 18;
bool canLogin = hasAccount && isPasswordCorrect;
このようなコードに出てくる +、>=、&&、= などが演算子です。
C#の演算子は種類が多いため、初心者のうちは「どれを使えばいいのか」「どの順番で計算されるのか」「= と == は何が違うのか」で混乱しやすいです。
この記事では、C#の演算子について、算術演算子、比較演算子、論理演算子、代入演算子、その他よく使う演算子、優先順位、よくある間違いまで初心者向けに解説します。
1. C#の演算子とは?まず押さえたい基本
C#の演算子を理解するには、まず「演算子」「オペランド」「式」という基本用語を押さえておくことが大切です。
これらの意味がわかると、コードを読むときに「何に対して、どんな処理をしているのか」が見えやすくなります。
1-1. 演算子・オペランド・式の意味
演算子とは、値に対して何らかの処理を行う記号やキーワードのことです。
たとえば、次のコードを見てみましょう。
C#int result = 10 + 5;
この中の + が演算子です。
10 と 5 は、演算子によって処理される値です。このような値を「オペランド」と呼びます。
つまり、10 + 5 では、+ が演算子、10 と 5 がオペランドです。
また、10 + 5 のように評価すると結果が得られるものを「式」と呼びます。
C#10 + 5 // 式
age >= 18 // 式
x = 100 // 式
C#では、式を評価すると何らかの値になります。
たとえば、10 + 5 は 15 になり、age >= 18 は true または false になります。
1-2. C#で演算子を使う主な場面
C#の演算子は、さまざまな場面で使います。
代表的な場面は次のとおりです。
C#int price = 1000;
int tax = 100;
int total = price + tax;
この例では、+ を使って金額を足しています。
C#if (age >= 18)
{
Console.WriteLine("成人です");
}
この例では、>= を使って年齢が18以上かどうかを判定しています。
C#if (isMember && hasCoupon)
{
Console.WriteLine("割引できます");
}
この例では、&& を使って「会員であり、クーポンを持っている」という複数条件を組み合わせています。
C#count += 1;
この例では、+= を使って変数の値を増やしています。
このように、C#の演算子は計算、判定、条件分岐、繰り返し処理、代入など、プログラムの基本動作に深く関わっています。
1-3. 初心者が混乱しやすい「演算」と「代入」の違い
C#初心者が特に混乱しやすいのが、「演算」と「代入」の違いです。
演算は、値を使って計算や判定を行うことです。
C#10 + 5
age >= 18
一方、代入は、変数に値を入れることです。
C#int number = 10;
このコードの = は「等しい」という意味ではありません。
C#では、= は右側の値を左側の変数に入れるための代入演算子です。
C#int x = 10;
これは「x と 10 が等しい」という意味ではなく、「x に 10 を代入する」という意味です。
等しいかどうかを比較したい場合は、== を使います。
C#if (x == 10)
{
Console.WriteLine("xは10です");
}
= と == の違いは、C#の演算子を学ぶうえで非常に重要です。
1-4. この記事で学べる演算子の全体像
この記事では、C#でよく使う演算子を次のように分類して解説します。
C#// 算術演算子
+ - * / % ++ --
// 比較演算子
== != > >= < <=
// 論理演算子
&& || ! & |
// 代入演算子
= += -= *= /= %=
// その他の演算子
?: ?? ??= ?. ?[] is as &
| ^ ~ << >> =>
すべてを一度に暗記する必要はありません。
まずは、算術演算子、比較演算子、論理演算子、代入演算子を理解することが大切です。
これらはC#の基本文法で頻繁に登場します。
2. C#の算術演算子|足し算・引き算・掛け算・割り算・余り
算術演算子は、数値の計算に使う演算子です。
C#で足し算、引き算、掛け算、割り算、余りを求めるときに使用します。
2-1. 算術演算子の一覧と基本的な使い方
C#の主な算術演算子は次のとおりです。
| 演算子 | 意味 | 例 |
|---|---|---|
+ | 加算 | a + b |
- | 減算 | a - b |
* | 乗算 | a * b |
/ | 除算 | a / b |
% | 剰余 | a % b |
++ | 1増やす | a++ |
-- | 1減らす | a-- |
基本的な使い方は、数学の計算に近いです。
C#int a = 10;
int b = 3;
Console.WriteLine(a + b); // 13
Console.WriteLine(a - b); // 7
Console.WriteLine(a * b); // 30
Console.WriteLine(a / b); // 3
Console.WriteLine(a % b); // 1
ただし、C#では整数同士の割り算や型の違いによって結果が変わるため、注意が必要です。
2-2. +・-・*・/・%の意味とコード例
+ は足し算に使います。
C#int result = 10 + 5;
Console.WriteLine(result); // 15
- は引き算に使います。
C#int result = 10 - 5;
Console.WriteLine(result); // 5
* は掛け算に使います。
C#int result = 10 * 5;
Console.WriteLine(result); // 50
/ は割り算に使います。
C#int result = 10 / 5;
Console.WriteLine(result); // 2
% は割り算の余りを求めるときに使います。
C#int result = 10 % 3;
Console.WriteLine(result); // 1
10 / 3 は商が 3、余りが 1 です。
そのため、10 % 3 の結果は 1 になります。
2-3. 整数同士の割り算で小数が切り捨てられる理由
C#で初心者がつまずきやすいのが、整数同士の割り算です。
C#int result = 5 / 2;
Console.WriteLine(result); // 2
数学的には 5 / 2 は 2.5 ですが、C#で int 同士を割ると結果も整数になります。
そのため、小数部分は切り捨てられます。
小数を含む結果が欲しい場合は、double や decimal を使います。
C#double result = 5.0 / 2;
Console.WriteLine(result); // 2.5
または、どちらか一方をキャストします。
C#int a = 5;
int b = 2;
double result = (double)a / b;
Console.WriteLine(result); // 2.5
5 / 2 と書くと整数同士の割り算になりますが、5.0 / 2 と書くと小数を含む計算になります。
金額計算など正確な小数計算が必要な場合は、decimal を使うこともあります。
C#decimal price = 100m;
decimal taxRate = 0.1m;
decimal tax = price * taxRate;
Console.WriteLine(tax); // 10.0
2-4. 剰余演算子%の使いどころ
剰余演算子 % は、割り算の余りを求める演算子です。
C#int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
% は、実務でもよく使います。
代表的な使いどころは、偶数・奇数の判定です。
C#int number = 8;
if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
2で割った余りが0なら偶数、1なら奇数です。
また、一定回数ごとに処理を行いたい場合にも使えます。
C#for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
Console.WriteLine($"{i}は3の倍数です");
}
}
このコードでは、3で割り切れる数だけを判定しています。
2-5. インクリメント++とデクリメント--の使い方
++ は変数の値を1増やす演算子です。
C#int count = 0;
count++;
Console.WriteLine(count); // 1
これは次のコードと同じ意味です。
C#count = count + 1;
-- は変数の値を1減らす演算子です。
C#int count = 5;
count--;
Console.WriteLine(count); // 4
これは次のコードと同じ意味です。
C#count = count - 1;
++ と -- は、繰り返し処理でよく使われます。
C#for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
このコードの i++ は、ループが1回終わるたびに i を1増やしています。
2-6. 前置と後置の違いに注意する
++ と -- には、前置と後置があります。
C#++x // 前置
x++ // 後置
単独で使う場合は、どちらも変数を1増やすため、結果は同じです。
C#int x = 1;
x++;
Console.WriteLine(x); // 2
int y = 1;
++y;
Console.WriteLine(y); // 2
しかし、式の中で使うと動きが変わります。
C#int x = 1;
int a = x++;
Console.WriteLine(a); // 1
Console.WriteLine(x); // 2
後置の x++ は、先に現在の値を使ってから、あとで1増やします。
一方、前置の ++x は、先に1増やしてから、その値を使います。
C#int x = 1;
int a = ++x;
Console.WriteLine(a); // 2
Console.WriteLine(x); // 2
初心者のうちは、式の中で ++ や -- を使うと混乱しやすいです。
読みやすさを重視するなら、次のように分けて書くのがおすすめです。
C#int x = 1;
x++;
int a = x;
3. C#の比較演算子|条件分岐で使う大小・等値判定
比較演算子は、2つの値を比較して、条件が正しいかどうかを判定する演算子です。
比較演算子の結果は、必ず bool 型の true または false になります。
3-1. 比較演算子の一覧
C#の主な比較演算子は次のとおりです。
| 演算子 | 意味 | 例 |
|---|---|---|
== | 等しい | a == b |
!= | 等しくない | a != b |
> | より大きい | a > b |
>= | 以上 | a >= b |
< | より小さい | a < b |
<= | 以下 | a <= b |
比較演算子は、if 文や while 文などの条件式でよく使います。
3-2. ==・!=・>・>=・<・<=の使い方
== は、2つの値が等しいかどうかを判定します。
C#int a = 10;
int b = 10;
Console.WriteLine(a == b); // True
!= は、2つの値が等しくないかどうかを判定します。
C#int a = 10;
int b = 20;
Console.WriteLine(a != b); // True
> は、左の値が右の値より大きいかどうかを判定します。
C#int score = 80;
Console.WriteLine(score > 70); // True
>= は、左の値が右の値以上かどうかを判定します。
C#int age = 18;
Console.WriteLine(age >= 18); // True
< は、左の値が右の値より小さいかどうかを判定します。
C#int temperature = 25;
Console.WriteLine(temperature < 30); // True
<= は、左の値が右の値以下かどうかを判定します。
C#int stock = 0;
Console.WriteLine(stock <= 0); // True
3-3. 比較演算子の戻り値はbool型になる
比較演算子の結果は、bool 型になります。
C#int age = 20;
bool isAdult = age >= 18;
Console.WriteLine(isAdult); // True
age >= 18 という式は、評価されると true または false になります。
その結果を bool 型の変数に代入できます。
C#bool result = 10 > 5;
Console.WriteLine(result); // True
C#では、条件式には基本的に bool 型の式を書きます。
C#if (age >= 18)
{
Console.WriteLine("成人です");
}
他の言語では 0 や 1 を条件として扱える場合がありますが、C#では if (1) のような書き方はできません。
C#// エラーになる
// if (1)
// {
// Console.WriteLine("実行");
// }
C#では、条件式には明確に true または false になる式を書く必要があります。
3-4. if文で比較演算子を使う基本例
比較演算子は、if 文と組み合わせてよく使います。
C#int score = 75;
if (score >= 60)
{
Console.WriteLine("合格です");
}
else
{
Console.WriteLine("不合格です");
}
このコードでは、score >= 60 が true なら「合格です」と表示されます。
年齢判定にも使えます。
C#int age = 16;
if (age >= 18)
{
Console.WriteLine("利用できます");
}
else
{
Console.WriteLine("18歳未満は利用できません");
}
在庫チェックにも使えます。
C#int stock = 3;
if (stock > 0)
{
Console.WriteLine("購入できます");
}
else
{
Console.WriteLine("在庫切れです");
}
比較演算子を使うことで、プログラムの処理を条件によって分けられます。
3-5. 文字列比較で==を使うときの注意点
C#では、文字列の内容が同じかどうかを == で比較できます。
C#string name1 = "Taro";
string name2 = "Taro";
Console.WriteLine(name1 == name2); // True
ただし、文字列比較では大文字と小文字が区別されます。
C#string a = "apple";
string b = "Apple";
Console.WriteLine(a == b); // False
大文字・小文字を区別せずに比較したい場合は、Equals メソッドと StringComparison を使うと意図が明確になります。
C#string a = "apple";
string b = "Apple";
bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
Console.WriteLine(result); // True
また、ユーザー入力や表示言語に関係する比較では、文化圏のルールを考える必要がある場合もあります。
単純に同じ文字かどうかを判定したい場合は == でも問題ありませんが、検索や並び替えなどでは StringComparison を指定する習慣をつけると安全です。
4. C#の論理演算子|複数条件を組み合わせる
論理演算子は、複数の条件を組み合わせるために使う演算子です。
「AかつB」「AまたはB」「Aではない」といった条件を表現できます。
4-1. 論理演算子の一覧
C#でよく使う論理演算子は次のとおりです。
| 演算子 | 意味 | 例 |
|---|---|---|
&& | かつ | a && b |
| ` | ` | |
! | 否定 | !a |
& | 論理ANDまたはビットAND | a & b |
| ` | ` | 論理ORまたはビットOR |
初心者がまず覚えるべきなのは、&&、||、! です。
& と | は、bool 型に対しても使えますが、短絡評価をしない点が重要です。
4-2. &&は「かつ」、||は「または」、!は「否定」
&& は「かつ」を表します。
両方の条件が true のときだけ、結果が true になります。
C#int age = 25;
bool hasTicket = true;
if (age >= 18 && hasTicket)
{
Console.WriteLine("入場できます");
}
この例では、「18歳以上」かつ「チケットを持っている」場合だけ入場できます。
|| は「または」を表します。
どちらか一方でも true なら、結果は true になります。
C#bool isMember = false;
bool hasCoupon = true;
if (isMember || hasCoupon)
{
Console.WriteLine("割引対象です");
}
この例では、「会員である」または「クーポンを持っている」場合に割引対象になります。
! は否定を表します。
true を false に、false を true に反転します。
C#bool isLoggedIn = false;
if (!isLoggedIn)
{
Console.WriteLine("ログインしてください");
}
!isLoggedIn は、「ログインしていない」という意味になります。
4-3. if文で複数条件を判定する方法
論理演算子を使うと、複数の条件を1つの if 文にまとめられます。
C#int age = 20;
bool hasLicense = true;
if (age >= 18 && hasLicense)
{
Console.WriteLine("運転できます");
}
else
{
Console.WriteLine("運転できません");
}
このコードでは、年齢が18歳以上で、かつ免許を持っている場合だけ「運転できます」と表示されます。
複数の条件を「または」で判定する場合は || を使います。
C#bool isAdmin = false;
bool isOwner = true;
if (isAdmin || isOwner)
{
Console.WriteLine("編集できます");
}
管理者または所有者であれば、編集できるという条件です。
論理演算子は組み合わせて使うこともできます。
C#int age = 20;
bool hasTicket = true;
bool isBanned = false;
if (age >= 18 && hasTicket && !isBanned)
{
Console.WriteLine("入場できます");
}
このコードでは、18歳以上、チケットあり、禁止ユーザーではない場合に入場できます。
4-4. &&と||の短絡評価とは
&& と || には、短絡評価という特徴があります。
短絡評価とは、結果が確定した時点で、残りの条件を評価しない仕組みです。
&& は、左側が false なら、全体の結果は必ず false になります。
そのため、右側は評価されません。
C#int x = 0;
if (x != 0 && 10 / x > 1)
{
Console.WriteLine("条件を満たしました");
}
このコードでは、x != 0 が false なので、右側の 10 / x > 1 は評価されません。
もし右側が評価されると、0で割ることになりエラーになります。
|| は、左側が true なら、全体の結果は必ず true になります。
そのため、右側は評価されません。
C#bool isAdmin = true;
if (isAdmin || CheckPermission())
{
Console.WriteLine("アクセスできます");
}
この場合、isAdmin が true なので、CheckPermission() は呼び出されません。
短絡評価は、不要な処理を避けたり、例外を防いだりするために役立ちます。
4-5. &と|との違い
&& と &、|| と | は似ていますが、動作が違います。
&& と || は短絡評価を行います。
一方、& と | は、bool 型に対して使った場合でも、左右の式を両方評価します。
C#bool result = false && Check();
この場合、左側が false なので、Check() は呼び出されません。
C#bool result = false & Check();
この場合、左側が false でも、Check() は呼び出されます。
確認用の例です。
C#static bool Check()
{
Console.WriteLine("Checkが呼ばれました");
return true;
}
bool a = false && Check(); // Checkは呼ばれない
bool b = false & Check(); // Checkは呼ばれる
通常の条件分岐では、&& と || を使うのが基本です。
& と | は、ビット演算や、あえて両方の式を必ず評価したい場合に使います。
4-6. 複雑な条件式を読みやすく書くコツ
条件式が長くなると、コードが読みにくくなります。
C#if (age >= 18 && hasTicket && !isBanned && isPaid)
{
Console.WriteLine("入場できます");
}
条件が増える場合は、意味のある変数に分けると読みやすくなります。
C#bool isAdult = age >= 18;
bool canEnter = isAdult && hasTicket && !isBanned && isPaid;
if (canEnter)
{
Console.WriteLine("入場できます");
}
また、複雑な条件では括弧を使って意図を明確にします。
C#if ((isAdmin || isOwner) && isActive)
{
Console.WriteLine("操作できます");
}
このコードでは、「管理者または所有者」で、かつ「有効なユーザー」である場合に操作できます。
条件式は短く書くことよりも、読み間違えにくく書くことが重要です。
5. C#の代入演算子と複合代入演算子
代入演算子は、変数に値を入れるための演算子です。
C#では、= を使って右側の値を左側の変数に代入します。
5-1. =は「等しい」ではなく「代入」
C#の = は、「等しい」という意味ではありません。
C#int x = 10;
このコードは、「x に 10 を入れる」という意味です。
等しいかどうかを判定する場合は、== を使います。
C#if (x == 10)
{
Console.WriteLine("xは10です");
}
= と == の違いは、C#初心者が必ず押さえるべきポイントです。
C#int x = 5;
x = 10; // 代入
x == 10; // 比較
代入は値を書き換える操作、比較は値が等しいかどうかを調べる操作です。
5-2. +=・-=・*=・/=・%=の使い方
複合代入演算子を使うと、変数の現在の値に対して計算し、その結果を同じ変数に代入できます。
C#int x = 10;
x += 5;
Console.WriteLine(x); // 15
x += 5 は、次のコードとほぼ同じ意味です。
C#x = x + 5;
主な複合代入演算子は次のとおりです。
| 演算子 | 意味 | 例 |
|---|---|---|
+= | 加算して代入 | x += 5 |
-= | 減算して代入 | x -= 5 |
*= | 乗算して代入 | x *= 5 |
/= | 除算して代入 | x /= 5 |
%= | 余りを代入 | x %= 5 |
コード例を見てみましょう。
C#int x = 10;
x += 2; // 12
x -= 3; // 9
x *= 4; // 36
x /= 6; // 6
x %= 4; // 2
Console.WriteLine(x);
複合代入演算子は、カウンターや合計値の更新でよく使います。
5-3. 複合代入演算子でコードを短く書く
複合代入演算子を使うと、コードを簡潔に書けます。
C#total = total + price;
これは、次のように書けます。
C#total += price;
合計金額を計算する例です。
C#int total = 0;
total += 100;
total += 200;
total += 300;
Console.WriteLine(total); // 600
ゲームでスコアを増やす場合にも使えます。
C#int score = 0;
score += 10;
score += 50;
Console.WriteLine(score); // 60
複合代入演算子は短く書けるだけでなく、「現在の値に対して何かを加える」という意図が伝わりやすくなります。
5-4. ==と=の書き間違いに注意する
C#では、= と == の書き間違いに注意が必要です。
C#int x = 10;
if (x == 10)
{
Console.WriteLine("xは10です");
}
これは正しい比較です。
一方、次のように書くとエラーになります。
C#int x = 10;
// エラー
// if (x = 10)
// {
// Console.WriteLine("xは10です");
// }
C#では、if 文の条件式には bool 型が必要です。
x = 10 は代入式であり、結果は int 型になります。
そのため、if の条件としては使えません。
ただし、bool 型の変数では、次のようなコードがコンパイルできてしまう場合があります。
C#bool isActive = false;
if (isActive = true)
{
Console.WriteLine("有効です");
}
このコードは、isActive に true を代入しているため、条件は常に true になります。
本来は次のように書くべきです。
C#if (isActive == true)
{
Console.WriteLine("有効です");
}
さらに、bool 型の場合は次のように書くのが一般的です。
C#if (isActive)
{
Console.WriteLine("有効です");
}
5-5. 代入式の戻り値と連続代入
C#では、代入式にも戻り値があります。
代入式の結果は、代入された値になります。
そのため、次のような連続代入ができます。
C#int a;
int b;
int c;
a = b = c = 10;
Console.WriteLine(a); // 10
Console.WriteLine(b); // 10
Console.WriteLine(c); // 10
このコードでは、まず c = 10 が評価され、その結果が b に代入され、さらにその結果が a に代入されます。
ただし、連続代入は便利ですが、使いすぎると読みにくくなることがあります。
初心者のうちは、必要な場合だけ使うとよいでしょう。
C#int a = 10;
int b = 10;
int c = 10;
こちらのほうが、何をしているかが明確な場合もあります。
6. C#のその他よく使う演算子
C#には、算術演算子、比較演算子、論理演算子、代入演算子以外にも便利な演算子があります。
ここでは、実務でもよく登場する演算子を中心に紹介します。
6-1. 条件演算子?:の使い方
条件演算子 ?: は、条件によって値を切り替える演算子です。
構文は次のとおりです。
C#条件 ? trueの場合の値 : falseの場合の値
例を見てみましょう。
C#int score = 80;
string result = score >= 60 ? "合格" : "不合格";
Console.WriteLine(result); // 合格
これは次の if 文と似た意味です。
C#string result;
if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}
条件演算子を使うと、単純な条件分岐を短く書けます。
ただし、条件が複雑な場合は if 文を使ったほうが読みやすいです。
C#string message = isLoggedIn ? "ようこそ" : "ログインしてください";
表示文言の切り替えなどに便利です。
6-2. null合体演算子??と??=の使い方
?? は、左側の値が null でなければ左側を使い、null なら右側を使う演算子です。
C#string? name = null;
string displayName = name ?? "ゲスト";
Console.WriteLine(displayName); // ゲスト
このコードでは、name が null なので、"ゲスト" が使われます。
name に値が入っている場合は、その値が使われます。
C#string? name = "Taro";
string displayName = name ?? "ゲスト";
Console.WriteLine(displayName); // Taro
??= は、左側が null の場合だけ代入する演算子です。
C#string? name = null;
name ??= "ゲスト";
Console.WriteLine(name); // ゲスト
すでに値が入っている場合は、代入されません。
C#string? name = "Taro";
name ??= "ゲスト";
Console.WriteLine(name); // Taro
?? と ??= は、null対策でよく使われます。
6-3. null条件演算子?.と?[]の使い方
?. は、左側が null でない場合だけメンバーにアクセスする演算子です。
C#string? name = null;
int? length = name?.Length;
Console.WriteLine(length); // 空またはnull
通常、name.Length のように書くと、name が null の場合に例外が発生します。
しかし、name?.Length と書くと、name が null の場合は例外を発生させず、結果が null になります。
配列やリストの要素にアクセスする場合は、?[] を使えます。
C#string[]? names = null;
string? firstName = names?[0];
Console.WriteLine(firstName); // null
?. や ?[] は、nullの可能性があるオブジェクトを安全に扱うために便利です。
6-4. 型判定に使うis演算子
is 演算子は、オブジェクトが特定の型かどうかを判定するときに使います。
C#object value = "Hello";
if (value is string)
{
Console.WriteLine("文字列です");
}
is は、パターンマッチングと組み合わせて使うこともできます。
C#object value = "Hello";
if (value is string text)
{
Console.WriteLine(text.Length);
}
このコードでは、value が string 型なら、text という変数として使えます。
数値の型判定にも使えます。
C#object value = 123;
if (value is int number)
{
Console.WriteLine(number + 10);
}
is は、安全に型を確認しながら処理したい場合に便利です。
6-5. 型変換に使うas演算子
as 演算子は、参照型やnull許容型に対して安全な型変換を行うために使います。
C#object value = "Hello";
string? text = value as string;
if (text != null)
{
Console.WriteLine(text.Length);
}
変換に成功すれば、その型の値が返ります。
変換に失敗した場合は、例外ではなく null が返ります。
C#object value = 123;
string? text = value as string;
Console.WriteLine(text == null); // True
ただし、最近のC#では、is のパターンマッチングを使ったほうが読みやすい場面も多いです。
C#if (value is string text)
{
Console.WriteLine(text.Length);
}
as は、変換できなかった場合に null として扱いたいときに使います。
6-6. ビット演算子の基本
ビット演算子は、整数を2進数のビット単位で操作する演算子です。
主なビット演算子は次のとおりです。
| 演算子 | 意味 |
|---|---|
& | ビットAND |
| ` | ` |
^ | ビットXOR |
~ | ビット反転 |
<< | 左シフト |
>> | 右シフト |
たとえば、& は両方のビットが1のときだけ1になります。
C#int a = 0b_1100; // 12
int b = 0b_1010; // 10
int result = a & b;
Console.WriteLine(result); // 8
| は、どちらかのビットが1なら1になります。
C#int a = 0b_1100;
int b = 0b_1010;
int result = a | b;
Console.WriteLine(result); // 14
ビット演算は、フラグ管理や低レベルな処理で使われます。
初心者が最初に深く覚える必要はありませんが、& と | は論理演算子との違いがあるため、存在は知っておくとよいです。
6-7. ラムダ式で使う=>との違い
=> は、ラムダ式で使う記号です。
厳密には、算術演算子や比較演算子のような計算用の演算子とは役割が異なります。
C#Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 25
このコードでは、x => x * x が「xを受け取り、x * xを返す処理」を表しています。
LINQでもよく使われます。
C#int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(x => x % 2 == 0);
=> は、「左側の引数を使って、右側の処理を行う」と考えると理解しやすいです。
条件演算子 ?: や比較演算子 >= とはまったく別の意味なので、混同しないようにしましょう。
7. C#の演算子の優先順位と結合規則
C#では、1つの式の中に複数の演算子がある場合、どの演算子から評価されるかが決まっています。
このルールを「演算子の優先順位」と呼びます。
7-1. 演算子の優先順位とは
演算子の優先順位とは、式の中でどの演算子を先に計算するかを決めるルールです。
たとえば、次の式を見てください。
C#int result = 1 + 2 * 3;
この場合、+ より * の優先順位が高いため、先に 2 * 3 が計算されます。
結果は次のようになります。
C#int result = 1 + 6; // 7
もし先に 1 + 2 を計算したい場合は、括弧を使います。
C#int result = (1 + 2) * 3;
Console.WriteLine(result); // 9
括弧を使うと、優先順位よりも先に評価されます。
7-2. 算術・比較・論理演算子の優先順位
初心者がまず覚えるべき優先順位は、次の順番です。
C#!、++、-- など
*、/、%
+、-
<、<=、>、>=
==、!=
&&
||
=、+=、-= など
たとえば、次の式では、算術演算が比較より先に行われます。
C#bool result = 10 + 5 > 12;
まず 10 + 5 が計算され、次に 15 > 12 が判定されます。
C#bool result = 15 > 12; // true
また、&& は || より優先順位が高いです。
C#bool result = true || false && false;
この場合、先に false && false が評価されます。
C#bool result = true || false; // true
ただし、このような式は読み間違えやすいため、括弧を使うのがおすすめです。
C#bool result = true || (false && false);
7-3. 同じ優先順位のときに使われる結合規則
同じ優先順位の演算子が並んでいる場合、どちらから結びつくかを決めるルールがあります。
これを「結合規則」と呼びます。
多くの二項演算子は、左から右に結合します。
C#int result = 10 - 3 - 2;
この場合、次のように評価されます。
C#int result = (10 - 3) - 2; // 5
10 - (3 - 2) ではありません。
一方、代入演算子は右から左に結合します。
C#int a;
int b;
int c;
a = b = c = 10;
これは次のように解釈されます。
C#a = (b = (c = 10));
結合規則は、同じ優先順位の演算子が並んだときに重要になります。
7-4. 括弧()で評価順を明確にする
優先順位に迷ったときは、括弧を使うのが一番安全です。
C#bool result = age >= 18 && hasTicket || isAdmin;
この式は、&& が || より先に評価されます。
つまり、次のように解釈されます。
C#bool result = (age >= 18 && hasTicket) || isAdmin;
もし「18歳以上で、チケットを持っているか管理者である」という条件にしたいなら、次のように書くべきです。
C#bool result = age >= 18 && (hasTicket || isAdmin);
括弧を使うことで、コードを書いた本人だけでなく、あとから読む人にも意図が伝わりやすくなります。
7-5. 優先順位とオペランドの評価順序の違い
優先順位と、オペランドが評価される順序は別の考え方です。
優先順位は、どの演算子を先に結びつけるかを決めます。
一方、評価順序は、式の中の値やメソッド呼び出しがどの順番で実行されるかを表します。
C#では、基本的にオペランドは左から右に評価されます。
C#int result = GetA() + GetB() * GetC();
この式では、* の優先順位が高いため、演算としては GetB() * GetC() が先に結びつきます。
しかし、メソッド呼び出しの評価は左から右に進むため、GetA()、GetB()、GetC() の順に呼び出されます。
この違いは、メソッド呼び出しや ++ を含む式で重要になります。
初心者のうちは、副作用のある処理を複雑な式の中に入れないようにすると安全です。
7-6. 初心者が覚えるべき優先順位の最低限ルール
C#の演算子の優先順位をすべて暗記する必要はありません。
初心者は、まず次のルールを覚えれば十分です。
C#1. 括弧が最優先
2. 掛け算・割り算・余りは、足し算・引き算より先
3. 比較演算は、算術演算のあと
4. && は || より先
5. 代入はかなり後
6. 迷ったら括弧を使う
たとえば、次の式を見てください。
C#bool result = 10 + 5 > 12 && 3 * 2 == 6;
評価の流れは次のようになります。
C#10 + 5 // 15
3 * 2 // 6
15 > 12 // true
6 == 6 // true
true && true // true
複雑に見える式でも、優先順位を分けて考えると理解しやすくなります。
7-7. 優先順位で間違いやすいコード例
優先順位で間違いやすい例を見てみましょう。
C#int result = 1 + 2 * 3;
Console.WriteLine(result); // 7
1 + 2 が先ではなく、2 * 3 が先です。
次の例も注意が必要です。
C#bool result = true || false && false;
Console.WriteLine(result); // True
&& が || より先に評価されるため、結果は true になります。
次のように括弧を付けると結果が変わります。
C#bool result = (true || false) && false;
Console.WriteLine(result); // False
条件式では、わかりやすさのために括弧を使うことが重要です。
C#if ((isMember || hasCoupon) && isActive)
{
Console.WriteLine("割引できます");
}
このように書くと、条件の意味が明確になります。
8. C#の演算子でよくあるエラーと間違い
C#の演算子は便利ですが、使い方を間違えるとエラーや意図しない動作につながります。
ここでは、初心者がよく間違えるポイントを紹介します。
8-1. =と==を間違える
もっとも多い間違いが、= と == の混同です。
= は代入です。
C#int x = 10;
== は比較です。
C#if (x == 10)
{
Console.WriteLine("xは10です");
}
特に bool 型では注意が必要です。
C#bool isAdmin = false;
if (isAdmin = true)
{
Console.WriteLine("管理者です");
}
このコードは、isAdmin に true を代入してしまいます。
本来は次のように書きます。
C#if (isAdmin)
{
Console.WriteLine("管理者です");
}
または、明示的に比較するなら次のように書きます。
C#if (isAdmin == true)
{
Console.WriteLine("管理者です");
}
ただし、bool 型の変数は if (isAdmin) のようにそのまま書くのが自然です。
8-2. &&と&、||と|を混同する
&& と &、|| と | は似ていますが、意味が異なります。
通常の条件式では、&& と || を使います。
C#if (user != null && user.IsActive)
{
Console.WriteLine("有効なユーザーです");
}
このコードでは、user が null の場合、右側の user.IsActive は評価されません。
そのため、例外を防げます。
一方、& を使うと右側も評価されます。
C#// userがnullの場合、例外になる可能性がある
// if (user != null & user.IsActive)
// {
// Console.WriteLine("有効なユーザーです");
// }
通常の条件分岐では、短絡評価を行う && と || を使いましょう。
8-3. 整数の割り算で期待した小数にならない
整数同士の割り算では、小数部分が切り捨てられます。
C#int result = 5 / 2;
Console.WriteLine(result); // 2
2.5 を期待している場合は、double や decimal を使います。
C#double result = 5.0 / 2;
Console.WriteLine(result); // 2.5
変数を使っている場合は、キャストします。
C#int a = 5;
int b = 2;
double result = (double)a / b;
Console.WriteLine(result); // 2.5
平均値や割合を計算するときは、このミスが起きやすいです。
8-4. nullを含む比較や演算で例外が起きる
オブジェクトが null の状態でメンバーにアクセスすると、例外が発生します。
C#string? name = null;
// 例外になる
// int length = name.Length;
このような場合は、null条件演算子 ?. を使います。
C#string? name = null;
int? length = name?.Length;
Console.WriteLine(length);
また、?? を使ってデフォルト値を指定することもできます。
C#string? name = null;
string displayName = name ?? "ゲスト";
Console.WriteLine(displayName); // ゲスト
nullの可能性がある値を扱うときは、?.、??、is not null などを使って安全に書きましょう。
C#if (name is not null)
{
Console.WriteLine(name.Length);
}
8-5. 優先順位を誤解して意図しない結果になる
演算子の優先順位を誤解すると、意図しない結果になります。
C#int result = 1 + 2 * 3;
Console.WriteLine(result); // 7
もし 9 を期待しているなら、括弧が必要です。
C#int result = (1 + 2) * 3;
Console.WriteLine(result); // 9
条件式でも同じです。
C#bool result = isAdmin || isOwner && isActive;
この式は、次のように解釈されます。
C#bool result = isAdmin || (isOwner && isActive);
もし意図が違うなら、括弧を使います。
C#bool result = (isAdmin || isOwner) && isActive;
複雑な式では、優先順位に頼りすぎず、括弧で明確にしましょう。
8-6. bool型以外を条件式に書いてしまう
C#の if 文では、条件式は bool 型でなければなりません。
C#int count = 1;
// エラー
// if (count)
// {
// Console.WriteLine("実行");
// }
C#では、0 を false、0以外 を true のようには扱いません。
明確に比較する必要があります。
C#if (count > 0)
{
Console.WriteLine("countは0より大きいです");
}
文字列の場合も同じです。
C#string name = "Taro";
// エラー
// if (name)
// {
// }
空文字かどうかを判定したい場合は、次のように書きます。
C#if (!string.IsNullOrEmpty(name))
{
Console.WriteLine(name);
}
C#では、条件式には必ず true または false になる式を書きましょう。
9. C#の演算子を実践で理解するサンプルコード
ここからは、C#の演算子を実際のコードで確認していきます。
演算子は読むだけでは身につきにくいため、自分でコードを書いて結果を確認することが大切です。
9-1. 四則演算を使った計算プログラム
まずは、算術演算子を使った基本的な計算プログラムです。
C#int a = 20;
int b = 6;
Console.WriteLine($"a + b = {a + b}");
Console.WriteLine($"a - b = {a - b}");
Console.WriteLine($"a * b = {a * b}");
Console.WriteLine($"a / b = {a / b}");
Console.WriteLine($"a % b = {a % b}");
実行結果は次のようになります。
C#a + b = 26
a - b = 14
a * b = 120
a / b = 3
a % b = 2
a / b は整数同士の割り算なので、結果は 3 になります。
小数で表示したい場合は、次のようにします。
C#double result = (double)a / b;
Console.WriteLine(result); // 3.3333333333333335
9-2. 比較演算子を使った年齢判定
次は、比較演算子を使った年齢判定です。
C#int age = 20;
if (age >= 18)
{
Console.WriteLine("成人です");
}
else
{
Console.WriteLine("未成年です");
}
age >= 18 は、年齢が18以上かどうかを判定しています。
条件を変えれば、さまざまな判定ができます。
C#int age = 65;
if (age >= 65)
{
Console.WriteLine("シニア料金の対象です");
}
else
{
Console.WriteLine("通常料金です");
}
比較演算子は、条件分岐の基本です。
9-3. 論理演算子を使ったログイン判定
複数条件を組み合わせる場合は、論理演算子を使います。
C#string inputId = "user001";
string inputPassword = "pass123";
string correctId = "user001";
string correctPassword = "pass123";
if (inputId == correctId && inputPassword == correctPassword)
{
Console.WriteLine("ログイン成功");
}
else
{
Console.WriteLine("ログイン失敗");
}
このコードでは、IDとパスワードの両方が一致した場合だけログイン成功になります。
&& は両方の条件が true のときだけ true になります。
管理者または一般ユーザーを判定する例も見てみましょう。
C#bool isAdmin = false;
bool isUser = true;
if (isAdmin || isUser)
{
Console.WriteLine("アクセスできます");
}
else
{
Console.WriteLine("アクセスできません");
}
|| は、どちらか一方が true なら true です。
9-4. 複合代入演算子を使った合計計算
複合代入演算子を使って、合計金額を計算してみます。
C#int total = 0;
int price1 = 1200;
int price2 = 800;
int price3 = 500;
total += price1;
total += price2;
total += price3;
Console.WriteLine($"合計金額は{total}円です");
実行結果は次のようになります。
C#合計金額は2500円です
total += price1 は、次のコードと同じ意味です。
C#total = total + price1;
繰り返し処理と組み合わせると、さらに実用的です。
C#int[] prices = { 1200, 800, 500 };
int total = 0;
foreach (int price in prices)
{
total += price;
}
Console.WriteLine($"合計金額は{total}円です");
合計値を計算する場面では、+= がよく使われます。
9-5. 条件演算子を使った表示切り替え
条件演算子 ?: を使うと、条件によって表示する文字列を切り替えられます。
C#int score = 75;
string result = score >= 60 ? "合格" : "不合格";
Console.WriteLine(result);
このコードでは、score が60以上なら "合格"、そうでなければ "不合格" が result に入ります。
ログイン状態の表示にも使えます。
C#bool isLoggedIn = true;
string message = isLoggedIn ? "ログイン中" : "未ログイン";
Console.WriteLine(message);
条件演算子は、単純な値の切り替えに向いています。
ただし、複雑な条件では if 文を使ったほうが読みやすいです。
9-6. 優先順位を確認できる練習問題
最後に、演算子の優先順位を確認する練習問題です。
次のコードの結果を考えてみましょう。
C#int result = 10 + 5 * 2;
Console.WriteLine(result);
* は + より優先順位が高いので、先に 5 * 2 が計算されます。
C#10 + 10 = 20
結果は 20 です。
次の問題です。
C#bool result = 10 > 5 && 3 + 2 == 5;
Console.WriteLine(result);
まず、10 > 5 は true です。
次に、3 + 2 == 5 は true です。
最後に、true && true なので結果は true です。
次のように括弧を付けると、さらにわかりやすくなります。
C#bool result = (10 > 5) && ((3 + 2) == 5);
優先順位に慣れるまでは、括弧を使って評価順を明確にしましょう。
10. C#の演算子を理解するための学習ポイント
C#の演算子は数が多いため、すべてを一度に覚えようとすると大変です。
効率よく理解するには、よく使うものから順番に学ぶことが大切です。
10-1. まず覚えるべき演算子一覧
初心者がまず覚えるべき演算子は、次のとおりです。
C#+ - * / %
= += -=
== != > >= < <=
&& || !
++ --
?: ?? ?.
これらを使えるようになれば、基本的な計算、条件分岐、繰り返し処理、null対策が書けるようになります。
特に重要なのは、次の4種類です。
C#算術演算子:+ - * / %
比較演算子:== != > >= < <=
論理演算子:&& || !
代入演算子:= += -=
まずは、この4種類を優先して覚えましょう。
10-2. 暗記よりコードを書いて確認する
演算子は、表を眺めて暗記するより、実際にコードを書いて確認するほうが身につきます。
C#int a = 10;
int b = 3;
Console.WriteLine(a + b);
Console.WriteLine(a / b);
Console.WriteLine(a % b);
Console.WriteLine(a > b);
Console.WriteLine(a == b);
出力結果を見ながら、「なぜその結果になるのか」を考えることが大切です。
特に、整数の割り算、++ の前置と後置、&& の短絡評価、優先順位は、実際に動かしてみると理解しやすくなります。
C#int x = 1;
Console.WriteLine(x++);
Console.WriteLine(x);
Console.WriteLine(++x);
Console.WriteLine(x);
自分で小さなサンプルを作ることで、演算子の動きが自然に身につきます。
10-3. 優先順位に迷ったら括弧を使う
演算子の優先順位をすべて覚える必要はありません。
迷ったら、括弧を使えば問題ありません。
C#bool canEnter = age >= 18 && hasTicket || isAdmin;
このような式は、意図が少しわかりにくいです。
C#bool canEnter = (age >= 18 && hasTicket) || isAdmin;
括弧を付けると、「18歳以上でチケットを持っている、または管理者」という意味が明確になります。
別の意図なら、次のようになります。
C#bool canEnter = age >= 18 && (hasTicket || isAdmin);
こちらは、「18歳以上で、チケットを持っているか管理者」という意味です。
括弧は、コードの読みやすさを高めるためにも積極的に使いましょう。
10-4. 実務でよく使う演算子から優先して覚える
実務で特によく使う演算子は、次のようなものです。
C#=
+=
==
!=
>
>=
<
<=
&&
||
!
??
?.
?:
たとえば、Webアプリケーションでは、ログイン判定や入力チェックで比較演算子と論理演算子をよく使います。
C#if (!string.IsNullOrEmpty(email) && password.Length >= 8)
{
Console.WriteLine("入力OK");
}
業務システムでは、金額や数量の計算で算術演算子や複合代入演算子を使います。
C#total += price * quantity;
nullの可能性があるデータを扱う場面では、?? や ?. がよく使われます。
C#string displayName = user?.Name ?? "未設定";
実務で使う頻度が高い演算子から覚えると、効率よくC#のコードを読めるようになります。
10-5. 公式リファレンスで確認する習慣をつける
C#の演算子は種類が多く、細かい仕様もあります。
すべてを暗記するのではなく、必要なときに公式リファレンスで確認する習慣をつけることが大切です。
特に、次のような内容は確認しながら学ぶとよいです。
C#演算子の優先順位
null関連の演算子
型判定と型変換
ビット演算子
オーバーロード可能な演算子
C#では、クラスや構造体に対して演算子を定義できる「演算子オーバーロード」もあります。
初心者のうちは使う機会は少ないですが、C#に慣れてきたら学ぶと理解が深まります。
まずは基本の演算子を使いこなし、必要に応じて詳しい仕様を調べる流れがおすすめです。
11. C#の演算子に関するよくある質問
ここでは、C#の演算子について初心者が疑問に思いやすいポイントをQ&A形式で整理します。
11-1. C#の演算子にはどんな種類がありますか?
C#の演算子には、算術演算子、比較演算子、論理演算子、代入演算子、条件演算子、null関連の演算子、型判定・型変換の演算子、ビット演算子などがあります。
代表的なものは次のとおりです。
C#算術演算子:+ - * / %
比較演算子:== != > >= < <=
論理演算子:&& || !
代入演算子:= += -= *= /= %=
条件演算子:?:
null関連:?? ??= ?. ?[]
型関連:is as
ビット演算子:& | ^ ~ << >>
初心者は、まず算術、比較、論理、代入の4種類を覚えるとよいです。
11-2. C#で「==」と「=」は何が違いますか?
= は代入、== は比較です。
C#int x = 10;
このコードは、x に 10 を代入しています。
C#if (x == 10)
{
Console.WriteLine("xは10です");
}
このコードは、x が 10 と等しいかどうかを比較しています。
= は値を入れるとき、== は等しいかどうかを調べるときに使います。
11-3. C#の「%」は何に使いますか?
% は剰余演算子で、割り算の余りを求めるために使います。
C#int result = 10 % 3;
Console.WriteLine(result); // 1
10 を 3 で割ると、商は 3、余りは 1 です。
そのため、結果は 1 になります。
% は偶数・奇数の判定によく使います。
C#int number = 7;
if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
また、倍数判定や一定間隔の処理にも使えます。
11-4. C#の「&&」と「&」の違いは何ですか?
&& は論理ANDで、短絡評価を行います。
左側が false の場合、右側は評価されません。
C#if (user != null && user.IsActive)
{
Console.WriteLine("有効なユーザーです");
}
このコードでは、user が null の場合、user.IsActive は評価されません。
一方、& は bool に対して使うと左右両方を必ず評価します。
また、整数に対して使うとビットANDとして動作します。
通常の条件分岐では、基本的に && を使います。
11-5. C#の演算子の優先順位は全部覚える必要がありますか?
すべて覚える必要はありません。
初心者は、まず次のルールを覚えれば十分です。
C#括弧が最優先
* / % は + - より先
比較演算は算術演算のあと
&& は || より先
代入は後のほう
迷ったら括弧を使う
優先順位に迷う場合は、括弧を使って明確に書くのが安全です。
C#bool result = (age >= 18) && (hasTicket || isAdmin);
コードは短さよりも、読みやすさと意図のわかりやすさが大切です。
11-6. 比較演算子と論理演算子はどう使い分けますか?
比較演算子は、1つの条件を判定するときに使います。
C#age >= 18
score == 100
name != ""
論理演算子は、複数の条件を組み合わせるときに使います。
C#age >= 18 && hasTicket
isAdmin || isOwner
!isDeleted
たとえば、年齢が18歳以上かどうかだけを判定するなら比較演算子を使います。
C#if (age >= 18)
{
Console.WriteLine("成人です");
}
年齢が18歳以上で、かつチケットを持っているかどうかを判定するなら、比較演算子と論理演算子を組み合わせます。
C#if (age >= 18 && hasTicket)
{
Console.WriteLine("入場できます");
}
比較演算子で条件を作り、論理演算子で条件を組み合わせる、と考えるとわかりやすいです。
まとめ
C#の演算子は、計算、比較、条件分岐、代入、null対策など、あらゆる場面で使われる重要な文法です。
まず押さえるべき基本は、次の4種類です。
C#算術演算子:+ - * / %
比較演算子:== != > >= < <=
論理演算子:&& || !
代入演算子:= += -= *= /= %=
算術演算子は数値の計算に使います。
C#int total = price + tax;
比較演算子は、値を比べて true または false を返します。
C#bool isAdult = age >= 18;
論理演算子は、複数の条件を組み合わせます。
C#bool canEnter = age >= 18 && hasTicket;
代入演算子は、変数に値を入れたり、現在の値を更新したりします。
C#count += 1;
また、条件演算子 ?:、null合体演算子 ??、null条件演算子 ?.、型判定の is、型変換の as なども実務でよく使います。
演算子の優先順位はすべて暗記しなくても問題ありません。
迷ったときは括弧を使って、評価順を明確にしましょう。
C#bool result = (age >= 18) && (hasTicket || isAdmin);
C#の演算子は、実際にコードを書いて試すことで理解が深まります。
小さなサンプルを作りながら、計算結果や条件判定の動きを確認していくことが、演算子を正しく使いこなす近道です。

