質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

436閲覧

C言語でのfor文について

shunkn

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2025/08/10 07:27

0

0

・私が書いたコードのfor文中のbreakがどのような意味を成しているのか

プログラミング初心者です。atcoderの練習問題「N 個の整数 A1​,A2​,⋯,ANの中に整数Xが含まれるかどうかを判定するプログラムを作成してください。(制約)N は1以上100以下の整数Xは1以上100以下の整数A1,A2,⋯,ANは1以上100以下の整数」をvisual studioで解いていました。以下のソースコードは私の解答なのですが、このまま「ビルド」をしてもエラーは表示されないのですが、「デバックなし」で実行するとすべて「no」と表示されてしまいます。試しに、以下のソースコードのfor文中の「break;」をコメントアウトすると上手く動作するようになりました。なぜ「break;」を無くすと上手く動作したのか教えてほしいです。因みに、私がbreakをfor文中に入れた理由は、問題文が「整数XがN個の整数ANに含まれているか」で、仮にAN中にXが複数存在しても一つ見つければいいので効率を考えてbreakを入れました。

該当のソースコード

C言語

1ソースコード 2#include<stdio.h> 3int main(void) { 4 5 int N, X; 6 int K[101]; 7 int B = 0; 8 9 scanf_s("%d", &N); 10 scanf_s("%d", &X); 11 12 for (int i = 0; i < N; i++) { 13 scanf_s("%d", &K[i]); 14 if (K[i] == X) 15 B = 1; 16 break; 17 18 } 19 20 if (B == 1) 21 printf("yes \n"); 22 else 23 printf("no \n"); 24 25 return 0; 26 27} 28 29### 試したこと 30 31ソースコードのfor文中のbreakを消した 32 33### 補足情報(FW/ツールのバージョンなど) 34C言語(visual studio2022 バージョン17.14.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taifu

2025/08/13 13:52

if (K[i] == X) B = 1; break; この部分、条件に合致したらbreakさせたいのだと思いますが、 このままだと条件合致時に処理されるのはB = 1;のみで、その後のbreakは必ず処理される形になります。 つまり、ループ1回目で必ずループ文を抜けていたわけです。 なので以下のように修正したらうまくいくと思いますよ if (K[i] == X){ B = 1; break; }
guest

回答4

0

break を「一つ見つけ」た時点で実行しようと考えておられたのですよね。しかし、

c

1 if (K[i] == X) 2 B = 1; 3 break;

では、if が成立した/していないに関係なく break が実行されてしまいます。
if は条件が成立したら直後の文を実行します。この場合は B=1; だけです。
では B=1;break;の両方つまり複数の文を実行させたい場合はどうするのかと言えば、それらを { } で囲むのです。

c

1 if (K[i] == X) { 2 B = 1; 3 break; 4 }

これで B=1; の後に break; が実行されます。

このように { } の有無によって実行される範囲が変わりますので、慣れないうちは『 if の条件が成立した時の処理が例え 1 行だけであっても {} で囲うことにする 』という自分ルールを設けておくと、動作タイミングで悩むことが減るかもしれません。

投稿2025/08/10 11:39

編集2025/08/10 15:53
jimbe

総合スコア13394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2025/08/10 22:07

> 複数の文を実行させたい場合はどうするのかと言えば、それらを { } で囲む ifには{}が標準で、”1文だけの時は省略できる"、と覚えている人が世の中の3割ぐらいいるような気がします。 まぁ、そう覚えていても実害はないのですけれど。
u2025

2025/08/11 00:18

”1文だけの時は省略できる"ってなにか間違っているのですか? 実際に複文でなければ省略できます
otn

2025/08/11 01:07

「省略できる」と書くと、「文法的に、本来は書くのだが、このケースでは書かなくていい」というトーンに解釈するのが普通だから、そういう意味で「省略できる」と書いたのであれば間違っています。まあ、日本語の用語の使い方は人それぞれなので「本来は書くのだが」という意味を込めてないのであれば、間違いではないかもしれません。 「1 行だけであっても {} で囲うことにする」というコーディングルールを初心者に勧めるのは、この質問のようなミスを防ぐという意味で良いことですが、コーディングルールと文法は別の話です。 Cより先に「 { } までがfor構文の一部で常に { } を書くような言語」からプログラミング入門した人は「Cだと省略できる」と思ってしまうのかもしれません。 似た例では、「関数には本来returnを書くのだが、特定のケースの時だけ省略できる」vs「returnが必要なら書くし、必要なければ書かない」。 これも「関数には常にreturnを書くというコーディングルールを採用する」というケースがあるのかもしれません。
thkana

2025/08/11 05:57

その知識によって書くプログラムが変わるわけではないのですけどね。「省略」という言葉を使う方は文法を調べたことがないか、知ってても無視しているかのどちらかなんだろうなぁ、と思うわけです。 ちょっと古いですが、JIS X3010、日本語のいわゆるC99の規格書はネット上で参照できるので見てみますと、{ }で囲む「複合文」は6.8.2に、if文とswitch文は「選択文」として6.8.4に、それぞれ別のものとして記述されています。 6.8.2 複合文 構文規則 { ブロック構成要素並びopt } 6.8.4 選択文 構文規則 if ( 式 ) 文 if ( 式 ) 文 else 文 switch ( 式 ) 文 if ( 式 ) 複合文 でもなく、if ( 式 ) { 文並び } とも書かれていません。説明に省略云々の話も書かれていません。 {}が必要なところ、例えば関数定義であれば6.9.1に 宣言指定子列 宣言子 宣言並びopt 複合文 として「複合文」を含んで定義されていますし、構造体等は6.7.2.1 構造体共用体 識別子opt { メンバ宣言並び } として{ }が登場しています。 if文で「文1つのときには{ }が無くても文法的に正しい」のはその通り。 でもそれは「ひとつの文なら省略できるから」ではなく、「{}が複数の文をひとつの文として扱うために必要になるものだから」です。そもそも無いものなので「省略」という言葉は適切でありません。
raccy

2025/08/11 12:05

C23の利用可能な最終ドラフトN3220を読むと、if文で条件式の括弧の後は「statement」ではなく「secondary-block」に変更されたようです。どういうことかというと、一つの文だけであってもブロック(スコープを構成するもの)を構成することになり、ブロックを構成するのに必要な{}が暗黙的に存在するといてっもいいような解釈になったようです。そういう意味では{}が「省略」されていると表現することはC23以降では正しいのかもしれません。
thkana

2025/08/11 23:26

( 規格制定側が「どっちでもいいじゃん」、と思ってしまったという感じかなw)
guest

0

酒を舐めながら書いてみた。
酔っ払ってます(謎

なお、問題は多分これだと思う。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <stdbool.h> 4#include <string.h> 5 6bool A02(char N[], char X[], char array[]) 7{ 8 char* delim = " "; 9 char* word; 10 for (size_t i = 0; i < strtol(N, NULL, 10); i++) 11 { 12 word = strtok(i == 0 ? array : NULL, delim); 13 if (strcmp(word, X) == 0) 14 { 15 return true; 16 } 17 } 18 return false; 19} 20 21int main(void) 22{ 23 char N[4] = { 0 }; 24 char X[4] = { 0 }; 25 char buffer[512] = { 0 }; 26 scanf("%8[^\n]%*[^\n]", buffer); 27 getchar(); 28 char* delim = " "; 29 strncpy(N, strtok(buffer, delim), 3); 30 N[3] = '\0'; 31 strncpy(X, strtok(NULL, delim), 3); 32 X[3] = '\0'; 33 scanf("%400[^\n]%*[^\n]", buffer); 34 getchar(); 35 printf("%s\n", A02(N, X, buffer) ? "Yes" : "No"); 36 return EXIT_SUCCESS; 37} 38

「なるたけ安全な入力を・・・」とか考えるとメンドイぞ、Cは(怒
Linuxだとeditlineに逃げる、って手があるけど、あいにくWindowsじゃ使えない(と言うより使いづらい)。
最初は入力データを全部数値に直す、って考えてたんだけど、VLA(可変長配列)がオプショナルな世の中じゃPOISON!だ(謎
結果、文字列のままデータを流して、strtokに頼った方がいいだろ、と方針変換。

いや、ホントCってメンドイね。

参考まで、に。

投稿2025/08/10 14:27

編集2025/08/10 22:38
cametan

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2025/08/10 16:45

>N 個の整数 A1​,A2​,⋯,ANの中に整数Xが含まれるかどうかを判定するプログラムを作成してください。 という問題への回答として考えたコードが思ったように動かないという質問であって、 >「なるたけ安全な入力を・・・」とか考える というようなことは書いてありませんが…。
cametan

2025/08/10 16:53

うん。書いてないね。 ただ、原則「締め切った」ネタでしょ? Teratailがなんで「締め切った」問題に関わらず回答受付状態にしてるのか知らんけど、ある種「回答例示」集めてアーカイヴ化狙ってんじゃないのかしらん? まぁ、そうなんじゃないか、ってぇんで、追加回答をアップした、って程度です。
guest

0

ベストアンサー

問題文が「整数XがN個の整数ANに含まれているか」で、仮にAN中にXが複数存在しても一つ見つければいいので

本題からは逸れますが、「一つ見つければいいので」あれば、変数 K を配列ではなくスカラー変数として宣言すれば十分かと思います。
また、変数 B をフラグ変数として使用していますが、X に一致する値が入力された時点で処理が完了となりますので、return 0; 文で終了としてもよいかと思います。

c

1#include <stdio.h> 2 3int main(void) { 4 int N, X, K; 5 6 scanf_s("%d", &N); 7 scanf_s("%d", &X); 8 for (int i = 0; i < N; i++) { 9 scanf_s("%d", &K); 10 if (K == X) { 11 printf("yes \n"); 12 return 0; 13 } 14 } 15 16 printf("no \n"); 17 return 0; 18}

投稿2025/08/10 08:11

melian

総合スコア21361

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1回forが実行されてbreakには必ず到達するので、ループしないというミスだと思います

C言語のカッコってやっぱりわかりやすいなぁ

ところで、入力は先に全部受けとった方がデバッグしやすいと思いますよ。
分岐やループはそんなに遅い計算じゃないです

投稿2025/08/10 07:32

u2025

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunkn

2025/08/10 07:53

回答ありがとうございます。追加でお聞きしたいことがあります。AN中にXが複数存在しても一つ見つけしだいすぐにfor文を抜け出すにはif文の中に「break;」を書き込めばいいのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問