1. 式 vs 文
C#では、すべての文は2つのカテゴリに分かれるんだ:文(Statement)と式(Expression)。文は「実行される」って言うし、式は「評価される」って言う。でも、それが一番大事な違いじゃない。
一番大事なのは:式には評価結果があるってこと。その結果には型があって、変数に代入したり、他の式で使ったりできるんだ。
例:
| コード | メモ |
|---|---|
|
文 |
|
式、型はbool |
|
式、型は変数iと同じ |
|
式、型は変数xと同じ |
これって何が嬉しいの?
多くの文は実は式(評価結果がある)なんだ。たとえば、こんなコードもOK:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
式の結果がいらないなら、無視してもOK:
Console.ReadLine(); // 入力結果は無視
式が結果以外にも何かしてくれる(たとえば画面に出力したり、入力を読んだり)場合は便利だよね。
2. 三項演算子
C#には特別な三項(トリプル)演算子があるよ。これはif–elseの省略形みたいなもの:
条件 ? 式1 : 式2;
条件がtrueなら式1が評価されて、そうじゃなければ式2が評価される。条件の後に?、2つの式は:で区切るよ。
if-elseとの一番の違いは:三項演算子は「式」ってこと。結果を変数に代入したり、他の式で使ったりできるんだ。
たとえば、2つの数字の最小値を計算してみよう:
int a = 2;
int b = 3;
int min = a < b ? a : b;
または、条件によって変数に違う値を代入したいとき:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
三項演算子だとこうなる:
int age = 25;
int money = age > 30 ? 100 : 50;
どっちを使うべき?if-elseと三項演算子、速度は変わらないけど、三項演算子は短い条件に向いてるよ。1行で収まらないなら、読みやすさのためにif-elseを使ったほうがいい。
3. 細かい動作の話
値の型
三項演算子の両方の分岐(<真のときの値>と<偽のときの値>)は同じ型か、互換性がある型じゃないとダメ(たとえば両方stringとかintとか)。
OKな例:
int a = 10, b = 20;
int max = (a > b) ? a : b; // 両方int
コンパイルエラー:
int a = 10, b = 20;
// stringとintは互換性なし
string result = (a > b) ? "大きい" : 0; // コンパイルエラー
正しい例:
int a = 10, b = 20;
string result = (a > b) ? "大きい" : "小さいか同じ";
例:数字の処理
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. 三項演算子をアプリに組み込む
ちょっとした対話アプリを書いてみよう:挨拶だけじゃなくて、来年何歳になるか、そして成人かどうかも教えてくれるやつ。
Console.Write("あなたの名前を入力してください: ");
string name = Console.ReadLine();
Console.Write("あなたの年齢を入力してください: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "成人" : "未成年";
Console.WriteLine($"こんにちは、{name}!来年は{nextYear}歳になります。あなたは{status}です。");
細かい説明:
- 変数statusは三項演算子で計算してる:来年の年齢が18以上なら成人(もしくはそのまま成人)、そうじゃなければ未成年。
- 三項演算子は文字列の中(たとえば$""の補間)にも簡単に組み込めるよ。
5. ネストした三項演算子 — 注意!
三項演算子は入れ子(ネスト)にできる(それぞれの分岐にさらに三項演算子を入れる)。でも…だいたい頭がこんがらがるから、後で読む人(2日後の自分も含む)のためにも注意しよう。
例:年齢でカテゴリ分け
string category = (age < 7) ? "幼児" :
(age < 18) ? "学生" :
(age < 65) ? "大人" : "高齢者";
判断表:
| 年齢 | 条件 | 結果 |
|---|---|---|
| < 7 | age < 7 | 幼児 |
| 7–17 | age < 18 | 学生 |
| 18–64 | age < 65 | 大人 |
| 65以上 | それ以外 | 高齢者 |
このくらいならまだ読めるけど、もっと複雑ならif-else if-elseを使ったほうがいいよ。
6. ライフハック:三項演算子とbool型
たまにこんなコード見るけど:
bool adult = (age >= 18) ? true : false;
でもこれは冗長。(age >= 18)自体がboolを返すから、こう書けばOK:
bool adult = (age >= 18);
GO TO FULL VERSION