記事内に広告が含まれています

C#入門④|演算子の基本

C#入門④ 基本文法・構文解説

前回はループ構文(foreach・for・while)の基本について学びました。

今回は、数値の計算、条件分岐、データの更新など、さまざまな場面で使われる演算子の基本について解説します。

算術演算子

算術演算子は、数値の四則演算を行うための演算子で、実務でも非常によく登場します。

基本的な使い方

C#の算術演算子には次のようなものがあります。

  • + : 加算(足し算)
  • - : 減算(引き算)
  • * : 乗算(掛け算)
  • / : 除算(割り算)
  • % : 剰余(あまり)

以下は算術演算子の使用例です。

int a = 10;
int b = 3;

Console.WriteLine(a + b); // 13  (10 + 3)
Console.WriteLine(a - b); // 7   (10 - 3)
Console.WriteLine(a * b); // 30  (10 * 3)
Console.WriteLine(a / b); // 3   (10 ÷ 3) ※小数点以下切り捨て
Console.WriteLine(a % b); // 1   (10 ÷ 3 の余り = 1)

同じ型同士での計算は結果も同じ型になるという決まりがあるので、a / bの結果もint型となり、小数点以下は切り捨てになります。

計算順序の指定

複雑な式では、()を使うと計算の順番を明確に指定できます。

var result1 = 2 + 3 * 4;
Console.WriteLine(result1); // 14 (掛け算が先)

var result2 = (2 + 3) * 4;
Console.WriteLine(result2); // 20 (2+3を先に計算してから掛け算)

掛け算(*)や割り算(/)は加算・減算よりも優先されるため、思った通りの順番で計算させたいときは()を使うのがポイントです。

+演算子による文字列の連結

+演算子は、数値に使うと加算になりますが、文字列に使うと「連結する」という意味になります。

var firstName = "山田";
var lastName = "太郎";

var fullName = firstName + " " + lastName;
Console.WriteLine(fullName); // 山田 太郎

この例では、firstNameとlastNameの間にスペース(” “)をはさんで、一つの文字列にしています。

代入演算子

代入演算子「=」は、右辺の値を左辺の変数に代入するための演算子です。

今までのサンプルコードでも何度も登場していますが、例えば、int x = 5; はint型の変数xに5を代入するという意味になります。

数学でいうイコール(左と右が等しい)という意味ではないので注意してください。

複合代入演算子

C#では、計算と代入をまとめて1回で書ける「複合代入演算子」というものも用意されています。

普通なら次のように書きます。

x = x + 3;

複合代入演算子を使うと、より簡単に書くことができます。

x += 3;

このように、算術演算子(+など)と代入演算子(=)を組み合わせたものが複合代入演算子です。

複合代入演算子には次のものがあります。

  • += : 加算代入(例:x += 3;x = x + 3; と同じ)
  • -= : 減算代入(例:x -= 2;x = x - 2; と同じ)
  • *= : 乗算代入(例:x *= 5;x = x * 5; と同じ)
  • /= : 除算代入(例:x /= 2;x = x / 2; と同じ)
  • %= : 剰余代入(例:x %= 3;x = x % 3; と同じ)

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

変数の値を1だけ増やしたり、減らしたりできる専用の演算子も用意されています。

ループ処理などで非常によく使われる、実務で出番の多い演算子です。

  • ++ : 変数の値を1つ増やす
  • -- : 変数の値を1つ減らす

これらは一般的に、変数の後ろに付けて使います。

int i = 0;

i++; // iの値が1増える
Console.WriteLine(i); // 1

i--; // iの値が1減る
Console.WriteLine(i); // 0

このように、i++と書けばiの値が1増え、i--と書けば1減ります。

以下の書き方は全て同じ結果です。インクリメント演算子を使うことでより簡潔に記載することができます。

i = i + 1;
i += 1;
i++;

インクリメント・デクリメント演算子は、for文などのループで特によく登場します。

for (var i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}

この例では、ループが1回回るごとにi++でカウントアップしています。

逆に、カウントダウンをしたい場合はi--を使います。

比較演算子

比較演算子は、2つの値を比べて、大きい・小さい・等しい・異なるを判定するときに使います。

主な比較演算子は次の通りです。

  • ==(等しい)
  • !=(異なる)
  • <(小さい)
  • >(大きい)
  • <=(以下)
  • >=(以上)
var x = 5;
var y = 8;

// xとyが等しいか
Console.WriteLine(x == y); // false

// xとyは等しくないか
Console.WriteLine(x != y); // true

// xはyより小さいか
Console.WriteLine(x < y); // true

// xはyより大きいか
Console.WriteLine(x > y); // false

// xはy以下か
Console.WriteLine(x <= y); // true

// xはy以上か
Console.WriteLine(x >= y); // false

比較演算子は以下のようにif文とよく組み合わせて使われます。

if (x >= y)
{
    Console.WriteLine("xはy以上です");
}
else
{
    Console.WriteLine("xはy以上ではありません");
}

「=(代入)」と「==(等価)」の違いに注意してください。

if (x = y) // ←これはエラーになる

このように = を使ってしまうと「代入」になってしまい、意図しない動作やエラーになります。比較するときは必ず == を使いましょう。

論理演算子

論理演算子は、「複数の条件を組み合わせる」ための演算子です。

if文でよく使われ、比較演算子と組み合わせることで複雑な条件を扱えるようになります。

  • &&:論理積(AND・かつ)
  • ||:論理和(OR・または)
  • !:否定(NOT・ではない)
var score = 75;

// AND(&&): 「scoreが60以上 かつ 100以下」の場合は合格
if (60 <= score && score <= 100)
{
    Console.WriteLine("合格です"); // 両方の条件がtrueなので実行される
}

// OR(||): 「scoreが0未満 または 100より大きい」場合は不正な点数
if (0 < score || score > 100)
{
    Console.WriteLine("点数が不正です");
}

// NOT(!):「scoreが60以上 でない」場合は不合格
if (!(score >= 60))
{
    Console.WriteLine("不合格です");
}

なお、&&や||には短絡評価(ショートサーキット評価)という、左側の条件だけで結果が決まる場合は、右側の条件は評価されないという仕組みがあります。

無駄な処理をスキップできるため、プログラムの動作が効率的になります。

先ほどのサンプルコードをベースに説明します。

var score = 50;

// ANDの場合、左側がfalseの場合は右側は実行されない
if (60 <= score && score <= 100)

この場合は、左側がfalseなので、右側は実行(評価)されません。

ANDは「いずれもtrueならtrue」なので、左側がfalseの時点で結果はfalseと確定するためです。

var score = -1;

// ORの場合、左側がtrueの場合は右側は実行されない
if (0 < score || score > 100)

この場合は、左側がtrueなので、右側は評価されません。

ORは「いずれかがtrueならtrue」なので、左側がtrueの時点で結果が確定するためです。

型変換に使う演算子(キャスト / is / as)

C#では、ある値の「型」を変換したいときに、次の3つの演算子を使います

  • 型キャスト演算子(明示的な型変換)
  • is 演算子(ある型かどうか調べる)
  • as 演算子(失敗時はnullになる)

それぞれの使い方と違いを見ていきましょう。

型キャスト演算子

型キャスト演算子は、値をある型から別の型に明示的に変換するための演算子です。

使い方は簡単で、変えたい値の前に (変換したい型名) を付けるだけです。

以下はdouble型(小数あり)の値をint型(整数)に変換する例です。

double pi = 3.14;
int intValue = (int)pi;  // 小数点以下が切り捨てられる
Console.WriteLine(intValue);  // 出力: 3

このように、小数から整数に変えるときは、小数点の情報が失われるため、明示的なキャストが必要になります。

逆に、int型から double型のように、情報が失われない変換(整数 → 小数)は、キャストを書かなくても自動で変換されます。

string型をint型など、間違った型に変換しようとすると、実行時にエラー(InvalidCastException)が発生します。

object obj = "文字列";
int number = (int)obj;  // string型をint型には変換できないので実行時エラーになる
Console.WriteLine(number);

is演算子

is 演算子は、「この値がある型に代入できるかどうか」を調べて、結果をbool(true/false) で返す演算子です。

object value = "こんにちは";

if (value is string)
{
    Console.WriteLine("これは文字列です");
}

C# 7.0以降では、型チェックとキャストを同時に行う書き方もできます。

// 変数valueの型がstringなら変数strにvalueを代入する
if (value is string str)
{
    Console.WriteLine(str.Length);  // strはstring型として使える
}

これはパターンマッチングと呼ばれる仕組みですが、少し高度な内容になるので詳細な使い方等については別途解説予定です。

as演算子

as 演算子は、ある値を特定の型に変換し、もし変換に失敗したら null を返します。

object obj1 = "Hello";
string s1 = obj1 as string;  // string型に変換できるのでs1には"Hello"が入る
Console.WriteLine(s1);       // 出力: Hello

object obj2 = 1;
string s2 = obj2 as string;  // string型に変換できないのでs2にはnullが入る
Console.WriteLine(s2 == null);  // 出力: True

キャスト演算子と異なり、as 演算子は例外を出さずに型変換の成否を確認できるのが特長です。
nullチェックとセットで使うのが基本です。

その他の演算子

その他のよく使う演算子としては、以下のようなものがあります。

  • 三項演算子(条件演算子):条件式 ? 値1 : 値2 で、「もし条件式が真なら値1を、偽なら値2を返す」という意味になります。詳細は第2回で解説しています。
  • null合体演算子:式1 ?? 式2 で、「式1が非nullだったら式1を、式1がnullだったら式2を採用する」という意味になります。後半の回で別途紹介します。

参考ドキュメント

C# 演算子と式 - C# リファレンス
C# 演算子と式、演算子の優先順位、演算子の結合規則について説明します。

まとめ

今回解説した演算子を表にまとめます。

カテゴリ演算子主な役割
算術演算子+, -, *, /, %数値計算、文字列の連結
代入・更新系=, +=, -=, *=, /=, %=, ++, —値を代入する、値を増減・更新する
比較演算子==, !=, <, >, <=, >=値の大小・等しいかどうかを比較
論理演算子&&, ||, !条件式を組み合わせる、条件を反転する
型チェック・変換系 (型名), is, as型を判定する、安全に変換する
その他の演算子?:, ??条件式を簡潔に書く、null時の処理を簡単にする

最初は種類が多く感じるかもしれませんが、実際にコードを書きながら少しずつ身につけていきましょう。

次回は、Listなどのコレクションの基本について解説します。

コメント

タイトルとURLをコピーしました