if文

条件分岐

プログラミングのコードは基本的に上から順に一行ずつコードが実行されます。
毎回決まりきった動作をさせるだけならばそれだけでも良いですが、実際のソフトウェアでは入力されたデータ(キーボードやファイルなど)によって動作を変化させることが良くあります。
そのためには条件分岐を使用します。

if文

if文は、ある条件に合致するか否かで処理を振り分けることができる構文です。


static void Main(string[] args)
{
    string str1 = "abcde";
    string str2 = "ab";

    if (str1.Length > 3)
    {
        Console.WriteLine("文字列str1の長さは3より大きいです。");
    }

    if (str2.Length > 3)
    {
        Console.WriteLine("文字列str2の長さは3より大きいです。");
    }

    Console.ReadLine();
}
文字列str1の長さは3より大きいです。

6行目ではif文を使用して、文字列str1の文字数をチェックしています。
文字数が3より大きい場合、if文に続くブロック内のコードが実行されます。
値の大小を判定するためにここでは不等号を使用しています。
(<、>)

条件判定の方法や値の比較方法などは次ページで詳しく解説します。

11行目のif文では、同じように文字列str2の文字数をチェックしています。
文字列str2は2文字しかないので、if文の条件を満たさず、続くブロック内のコードは実行されません。

条件を満たさなかった場合に別の文を実行する

条件を満たさなかった場合に別のコードを実行したい場合はelse文を使用します。
else文はif文とセットで使用します。


static void Main(string[] args)
{
    string str = "ab";

    if (str.Length > 3)
    {
        Console.WriteLine("文字列strの長さは3より大きいです。");
    }
    else
    {
        Console.WriteLine("文字列strの長さは3以下です。");
    }

    Console.ReadLine();
}
文字列strの長さは3以下です。

if文で指定した条件に合致しなかった時、続くelse文のブロック内のコードが実行されることになります。
if文の条件に合致した場合はelse文のブロックは実行されません。

条件を複数指定する

条件を複数同時に設定したい場合にはelse if文を使用します。
これもif文とセットで使用します。


static void Main(string[] args)
{
    string str = "abc";
    
    if (str.Length > 3)
    {
        Console.WriteLine("文字列strの長さは3より大きいです。");
    }
    else if(str.Length > 2)
    {
        Console.WriteLine("文字列strの長さは3です。");
    }
    else if (str.Length > 1)
    {
        Console.WriteLine("文字列strの長さは2です。");
    }
    else if (str.Length > 0)
    {
        Console.WriteLine("文字列strの長さは1です。");
    }
    else
    {
        Console.WriteLine("文字列strの長さは0です。");
    }
    
    Console.ReadLine();
}
文字列strの長さは2より大きいです。

else if文はいくつでも設定が可能です。

条件は最初のif文から順に上からチェックされていきます。
そして、最初に条件に合致したif文(else if文)のブロック内のコードが実行されます。

else if文は最初に条件を満たした文のみが実行されます。
それ以降に条件を満たすelse if文があったとしても実行されないことに注意してください。
このサンプルコードでは、「str.Length > 1」や「「str.Length > 0」という条件も満たしますが、先に9行目のelse if文の条件が満たされているので実行されません。

すべての条件式の条件が満たされなかった場合、最後のelse文が実行されます。
必要がなければelse文は省略可能です。

ブロック記号{}の省略

if文(else if文、else文)はブロック内に実行する文を記述しますが、実行する文が一行だけの場合はブロック記号を省略して書くことができます。


string str = "abc";

if (str.Length == 0)
{
    Console.WriteLine("文字列strは空文字です。");
}
else
{
    Console.WriteLine("文字列strは空文字ではありません。");
}

//↓のように書いても同じ

if (str.Length == 0)
    Console.WriteLine("文字列strは空文字です。");
else
    Console.WriteLine("文字列strは空文字ではありません。");

//↓改行しなくても良い

if (str.Length == 0) Console.WriteLine("文字列strは空文字です。");
else Console.WriteLine("文字列strは空文字ではありません。");

ブロックの省略はif文に限らず大抵の構文で可能です。

変数の初期化に注意

if文などの条件分岐は、条件によって実行されない文が発生することがあります。
実行されない可能性のあるブロックでしか変数の初期化を行っていない場合はエラーになります。


int num = -1;
string str;
if(num > 0)
{
    str = "変数numは0以上";
}            

//ここでエラー
Console.WriteLine(str);

上記のコードは、9行目で変数strが使用されるよりも前の段階で変数strに値が代入されることがないので、エラーになります。

変数numの値を0以上に書き換えてもダメです。


int num = 1;
string str;
if(num > 0)
{
    str = "変数numは0以上";
}            

//やっぱりここでエラー
Console.WriteLine(str);

上記の場合は変数numの値は1(0以上)になるのですが、「絶対」ではありません。
変数というのは様々な要因で値が書き換えられる可能性があり、プログラムの実行時までにどのような値が代入されているのかを確定することはできません。
なので、このような書き方は文法エラーとなります。
(コンパイル自体ができない)

どのような条件でも初期化が行われるならばOKです。


int num = 1;
string str;
if(num > 0)
{
    str = "変数numは0以上";
}
else
{
    str = "変数numは0未満";
}

Console.WriteLine(str);

ちなみに、if文に変数ではなく値を直接記述した場合(リテラルconst定数)は確実に実行されることがコンパイル時に確定するので、else文を書かなくてもエラーになりません。
もちろん、実行されないことが確実な場合はエラーです。


string str;
if(1 > 0)
{
    str = "確実に実行される文";
}

Console.WriteLine(str);