Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C・C++のgoto文とは?基本構文とサンプルコードでわかりやすく解説

goto文は、プログラムの制御を「goto」の位置から指定したラベルの位置へ一気にジャンプさせるジャンプ文の一種です。しかし、goto文を使うとプログラムの流れが複雑になり、コードの可読性や保守性が大きく低下するため、一般的には使用が推奨されていません。

goto文の基本構文

goto文の基本的な書式は以下のとおりです。

goto ラベル名;
.
.
.
ラベル名: 実行する文;

「goto」の後にジャンプ先のラベル名を指定します。プログラムの実行がgoto文に到達すると、同じ関数内にある対応するラベルの位置へ制御が移ります。

goto文のサンプルプログラム

ここで、C++でgoto文を使用した実際のプログラム例を見てみましょう。

#include <iostream>
using namespace std;
int main () {
    int i = 1;
    while(1) {
        cout<< i <<"\n";
        if(i == 10)
        goto OUT;
        i++;
    }
    OUT: cout<<"Out of the while loop";
    return 0;
}

実行結果

上記のプログラムをコンパイルして実行すると、次のような出力が得られます。

1
2
3
4
5
6
7
8
9
10
Out of the while loop

プログラムの流れを解説

それでは、このプログラムがどのように動作しているのか、順を追って見ていきましょう。

このプログラムでは、条件を常に真にしたwhileループ(無限ループ)を使用しています。ループが1周するごとに、変数iの現在の値が出力されます。その直後、if文によってiの値が10であるかどうかを判定しています。

iが10であれば、goto文が実行され、whileループの外側にあるラベル「OUT」へ制御がジャンプします。まだ10に達していなければ、iを1増やしてループ処理を継続します。

goto文のジャンプ先として指定されているのがラベル「OUT」です。このラベルに制御が移ることで、whileループから抜け出し、「Out of the while loop」というメッセージが画面に表示されます。該当するコード部分を抜き出すと、以下のようになります。

int i = 1;
while(1) {
    cout<< i <<"\n";
    if(i == 10)
    goto OUT;
    i++;
}
OUT: cout<<"Out of the while loop";

補足:break文との違いと注意点

なお、上記のように単にループを抜けるだけなら、break文を使うほうが簡潔で安全です。goto文は、多重ループからまとめて脱出するような特殊なケースで使われることがありますが、現代のプログラミングでは、if・for・while・break・continueといった構造化された制御構文を使うことがベストプラクティスとされています。安易なgoto文の使用は避け、可読性の高いコードを心がけましょう。

  1. 画像配列(イメージアレイ)とは?OpenCVとC++のサンプルコードでわかりやすく解説

    配列(アレイ)とは、複数のデータをまとめて効率的に格納し、取り出すための便利な仕組みです。OpenCVでは、この配列の概念を活用することで、複数の画像をひとつの「画像配列」に読み込み、インデックス番号を指定するだけで目的の画像を表示できます。 本記事では、Mat型の行列配列に複数の画像を読み込み、インデックス番号を使って各画像を表示するC++のサンプルプログラムを紹介します。 画像配列の基本的な考え方 通常、1枚の画像を読み込む場合はMatオブジェクトを1つ宣言すれば十分ですが、複数の画像を扱いたい場合には、Mat型の配列を宣言することで管理が簡単になります。配列の各要素にはimread()関

  2. C++で学ぶ式ツリー(Expression Tree)の基本と具体例

    式ツリーとは何か式ツリー(Expression Tree)とは、二分木の一種であり、木の各ノードが「演算子」または「オペランド(被演算子)」のいずれかで構成される特殊なデータ構造です。数式を木構造として表現することで、コンパイラや電卓アプリなどが数式を効率的に解析・評価できるようになります。ノードの役割式ツリーにおける各ノードは、次のように役割が分かれています。葉ノード(リーフノード):オペランド(数値や変数)を表します。非葉ノード(内部ノード):演算子(+、-、*、/ など)を表します。つまり、計算の対象となる値は必ず葉に配置され、それらをどのように処理するかを示す演算子が親ノードとして上に