C++でwhile文やif文の直後にセミコロンを付けるとどうなる?
はじめに
C++では、while文やif文の直後にうっかりセミコロン(;)を付けてしまうことがあります。一見すると些細な記述ミスに思えますが、このセミコロンの有無によってプログラムの動作は大きく変わります。本記事では、その仕組みをわかりやすく解説します。
セミコロン付きのwhile・if文の動作
たとえば、次のようなコードを考えてみましょう。
while (expression);
この場合、条件式が真であれば、ループ本体として「空の文(何もしない文)」が実行され続けるため、無限ループに陥ります。一方、条件式が偽であれば、ループ本体は一度も実行されません。
同様に、次のようなif文ではどうなるのでしょうか。
if (expression);
この場合も、条件式の評価結果が真であろうと偽であろうと、実際には何も処理が行われません。
なぜこのような動作になるのか
その理由は、if文とwhile文の構文が次のように定義されているからです。
if (<expr>) <statement> // または while (<expr>) <statement>
<statement>(本文)は、<expr>(条件式)が真である場合にのみ実行されます。while文の場合は、条件式が真であり続ける限り本文が繰り返し実行されるため、結果として無限ループになるのです。
ここで重要なのは、「どの<statement>が本文として実行されるのか」という点です。波括弧 {} で囲まれていない場合、次に現れるセミコロン(;)までの文が本文となります。その文が空であっても構いません。つまり、空の文はC++において有効な文として認められているのです。
if (<expr>) /* 空の文 */; while (<expr>) /* 空の文 */;
どちらの場合も、条件式が評価された後、実行される処理は何もありません。ただし、while文の場合は条件式が真のままだと無限ループに入る可能性がある点に注意が必要です。
補足:{}(ステートメントブロック)とは
なお、{} は「ステートメントブロック」と呼ばれる一種の文です。ブロックは、複数の文を内包できるリストを持つ文として扱われます。このため、if文やwhile文の本文として {} を指定すれば、複数の文をまとめて実行対象にすることができます。
まとめ
if文やwhile文の直後にあるセミコロンは「空の文」として解釈され、条件式の結果にかかわらず何も実行されません。意図しないバグ、特に無限ループを防ぐためにも、条件分岐やループを記述する際は本文を明確にし、不要なセミコロンを付けないよう心がけましょう。
-
C++におけるセミコロンの役割とは?文法上の位置づけを解説
はじめにC++プログラミングにおいて、セミコロン(;)は欠かすことのできない記号の一つです。一見地味な存在ですが、実はISO C++規格の中で明確な役割が定められています。本記事では、C++におけるセミコロンの位置づけと、文法上どのような場所で使用されるのかを解説します。セミコロンは「区切り子(punctuator)」として定義されているISO C++規格によると、C++プログラムの字句表現には多数の「前処理トークン(preprocessing tokens)」が含まれています。これらのトークンは、プリプロセッサの構文でそのまま利用されるか、あるいは演算子・区切り子(operators and
-
Javaの制御フロー構文を徹底解説:if、else、switchの使い方と実例コード
Javaには、プログラムの流れ(制御フロー)を操作するための方法がいくつか用意されています。制御フロー文は、条件分岐の仕組みを実装することで、プログラムの実行の流れを変更したり中断したりします。 Javaにおける条件分岐のための主な構文は以下の3つです。 if 文 if...else 文 switch 文 この記事では、Javaの制御フロー構文について、それぞれの説明と実際のコード例を交えて詳しく解説します。 Javaのif文とは if 文の基本構文は次のとおりです。 if(condition) { // 条件がtrueの場合にのみ、このコードが実行される } if