プログラムの流れと分岐
if文
ある条件が成立するかどうかによって、行うべき処理を決定するのがif文になります。
if – then 文
キーボードから数値を読み込んで、その値が0より大きければ、「その値は正です。」と表示するプログラムを作りましょう。
//Positive.java
//読み込んだ整数値の符号判定
import java.util.Scanner;
public class Positive {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数値:");
int n = stdIn.nextInt();
if(n > 0)
System.out.println("その値は正です。");
//n > 0がtrueのときに実行される
stdIn.close();
}
}
変数nに読み込んだ値を判定する部分が、if 文(if statement)と呼ばれ、その構文は、以下のようになっています。
if (式) 文
これは、if文の一種である if – then 文です。先頭のifは、「もしも~」という意味で、式の値を調べて、その条件に一致する時(真)となったときにのみ文が実行されます。これからの説明では、条件判定のための式を制御式と呼ぶことにします。
if文の制御式n > 0で利用している > は、左オペランドが右オペランドより大きければ true(真)、そうでなければ false(偽)を生成する演算子になります。この2つは理論値リテラル(boolean literal)と呼ばれる論理(boolean)型のリテラルになります。
関係演算子
演算子 > のように、オペランドの大小関係を判定する演算子を、関係演算子(relational operator)と呼びます。関係演算子には、以下の4種類があります。
x < y | xがyより小さければ true、そうでなければ false を生成 |
x > y | xがyより大きければ true、そうでなければ false を生成 |
x <= y | xがyより小さいか等しければ true、そうでなければ false を生成 |
x >= y | xがyより大きいか等しければ true、そうでなければ false を生成 |
if – then – else文
前のプログラムでは、正でない値を読み込むと何も表示しません。正でない場合には、「その値は0か負です。」と表示するように変更しましょう。
//PositiveNot.java
//読み込んだ整数値の符号判定
import java.util.Scanner;
public class PositiveNot {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数値:");
int n = stdIn.nextInt();
if(n > 0)
System.out.println("その値は正です。");
else
System.out.println("その値は0か負です。");
stdIn.close();
}
}
このプログラミングのif文は、以下の構文をもちます。
if (式) 文 else 文
もちろんelseは「~でなければ」という意味を持ちます。制御式の値がtrueならば先頭側の文を実行し、falseであれば、末尾側の文を実行します。そのため、nが正であるかで異なる処理が実行されます。
等価演算子
キーボードから読み込んだ2つの整数値が等しいかどうか判定して表示するプログラムを作りましょう。
//Equal.java
//読み込んだ2つの整数値が等しいか判別
import java.util.Scanner;
public class Equal {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:");
int a = stdIn.nextInt();
System.out.print("整数b:");
int b = stdIn.nextInt();
if(a == b)
System.out.println("2つの値は等しいです。");
else
System.out.println("2つの値は等しくありません。");
stdIn.close();
}
}
変数aと変数bに値を読み込んで、それらの値の等価性を判断します。if文の制御式で利用している、==は、左右のオペランドが等しいかどうかを判断します。これを等価演算子(equality operator)と呼びます。また、等しくないかどうか判断する!=もあります。
x == y | xとyが等しければtrueを、そうでなければfalseを生成 |
x != y | xとyが等し毛羽trueを、そうでなければfalseを生成 |
論理補数演算子
以下に示しているのは、キーボードから読み込んだ値が0であるかどうかを判定して表示するプログラムになります。
//Zero.java
//読み込んだ整数値が0か判別
import java.util.Scanner;
public class Zero {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数値:");
int n = stdIn.nextInt();
if(!(n != 0))
System.out.println("その値は0です。");
else
System.out.println("その値は0ではありません。");
stdIn.close();
}
}
単項演算子!は、論理補数演算子(logical complement operator)です。オペランドの値がfalseであれば、trueを生成し、trueであれば、falseを生成します。
!x | xがfalseであれば、trueを、trueであれば、falseを生成 |
入れ子となったif文
以下は、キーボードから読み込んだ整数値の符号を判定して表示するプログラムです。
//Sign.java
//読み込んだ整数値の符号(正/負/0)を判別
import java.util.Scanner;
public class Sign {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数値:");
int n = stdIn.nextInt();
if(n > 0)
System.out.println("その値は正です。");
else if(n < 0)
System.out.println("その値は負です。");
else
System.out.println("その値は0です。");
stdIn.close();
}
}
このプログラムには、else if… とありますが、そのような構文が特別に用意されているわけではないです。elseが制御する文は、当然if文でもかまいません。
入れ子のif文を利用した別のプログラムの例を以下に示します。読み込んだ整数値の符号が正であれば、偶数/奇数のいずれかであるかを表示します。
//EvenOdd.java
//読み込んだ値が偶数か奇数か判別
import java.util.Scanner;
public class EvenOdd {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数値:");
int n = stdIn.nextInt();
if(n > 0)
if(n % 2 == 0)
System.out.println("その値は偶数です。");
else
System.out.println("その値は奇数です。");
else
System.out.println("正の値ではありません。");
stdIn.close();
}
}
式と評価
式
これまでに、式(expression)という用語を何度か使いましたが、式は以下のものの総称になります。
- 変数
- リテラル
- 変数やリテラルを演算子で結合したもの
以下の式を例に考えましょう。
abc + 32
変数abc、整数リテラル32、それらを+演算子で結んだ abc + 32 のいずれも式になります。○○演算子によって結合された式のことを、○○式と呼びます。
評価
式には、基本的に値があります。その値は、プログラム実行時に調べられます。式の値を調べることを評価(evaluation)といいます。
評価のイメージを具体的にしたのが次の図です。
ここで、変数abcは、int型で値が50であるとします。abc、100、abc + 100はいずれも式です。変数abcの値が100なので、それぞれの式を評価した値は50、100、150になります。