3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

if文の波括弧{}を省略したら分岐処理が変わる原因と対策

Last updated at Posted at 2019-09-04

#近況報告

エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。

便利な書き方を知ればすぐに使いたくなりますが、用法を正しく守らないと予期せぬ挙動を行なってしまう可能性あり。
今回は、条件分岐をネスト構造で書く際、
ブロック(if ~ elseで使われる波括弧{}のこと)を省略すると戻り値が変わるパターンについてまとめます。

##if文のブロックは省略できる

分岐処理を書く場合のif 〜 elseは定番ですが、
結果処理{}は省略できます。

例えば、以下のように書いても分岐は正しく処理されます。

$x = 10;

if($x === 10)
  print '$変数xは10です';
else
  print '$変数xは10ではありません';

// 結果 $xは10です

##ネストされたif文の場合

では、ネストされたif文でブロックを外すとどうなるでしょう?
試しに、下記のように書いてみます

ブロックを省略
$x = 10;
$y = 5;

if($x === 10)
  if($y > 10) //ifのネスト
    print '変数$xが10かつ変数$yは10より大きい数値です';
  
else
  print '変数$xは10ではありません';


//結果 変数$xは10ではありません

上記では$xは10、$yは5なので、$x === 10はtrueとなるも$yは10より大きくない為、falseとなり、$y > 10のfalseの結果は何も表示されないことを期待していますが、なぜか「変数$xは10ではありません」という結果が出力されています。

その理由として、
分岐処理でブロック{}を外すと、elseブロックは直近のif命令に対応するとみなされることが挙げられます。

試しに、上記の分岐処理にブロックを加えてみましょう。

ブロックを省略しない
$x = 10;
$y = 5;

if($x === 10){
  if($y > 10){ //ifのネスト
    print '変数$xが10かつ変数$yは10より大きい数値です';
  }
}else{
  print '変数$xは10ではありません';
}

//結果 何も表示されない

何も表示されないことが確認できました。
つまり、「$x === 10」はtrueだが、$yは10より大きくない為falseとなり、「$y > 10」がfalseの時の結果処理はない為、何も表示されない、という事になります。

##if文のブロック{}はどんな条件の場合に省略してよい?

結論は**「if 〜 else」がネスト構造になってない場合のみ省略可能です。**

ネストされていると、elseは直近のifに対応する為、{}を省略した場合は意図しない動作をする可能性があるので要注意です。

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?