質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

Q&A

解決済

4回答

5785閲覧

C言語 : if文で複合文の後にセミコロンを置いてはいけないのはなぜ?!

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/08/28 18:46

編集2020/08/28 18:51

C

1//////////////////////////////////////// 2/* これは正常に動作する 以下、if_1 */ 3if (条件) 文_1; 4else 文_2; 5//////////////////////////////////////// 6 7//////////////////////////////////////// 8/* これはエラー 以下、if_2*/ 9if (条件) {文_1;}; 10else 文_2; 11////////////////////////////////////////

if_1は、その条件が0となっても正常にelseの文_2が実行されますが、if_2では、そもそもコンパイルエラー(; があると怒られる。elseがifと紐づいていない?)となります。
複合文は一つの文として扱われると習いましたが、この動作からするに、単に一つの文とは言えないと思いますが、なぜif文において複合文にセミコロンを置くとエラーが発生するのでしょうか?
もしかして、{}ですでに;の役割を果たしているということでしょうか。
あるいは、{}は単にまとまりを示すだけで、セミコロン云々は関係ありませんか?
とすると、{}で囲った複合分にはセミコロンをつける必要がないのですか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

C言語の「文」(statement)の定義には、式文(expression_statement)と複文(compound_statement)があります(他にもある)。

式文の定義は、単体の;、もしくは、「式」+; である。と定められています。

複文の定義は、単体の{}、もしくは、{+「ブロック内要素(複数可)」+} である。と定められています。

つまり、;は、その文が式文(もしくは他の;で終わるタイプの文)であることを示すためのものであって、全ての文の終わりに必ずつくわけではありません。

~~;{~~} は共に等価の「文」であるという事です。
なので、ブロックの終わりには、;を付ける必要がありません。

もし、{~~};と書いた場合、それは、{~~};の二つの文があるとみなされます。
(単体の;も一つの文になるので)

if文自体も、名前にそう付いているように1つの文です。
if文の定義は、こうなっています
if+(+式+)+文
もしくは
if+(+式+)+文+else+文

この定義から分かるように、if文自体の終わりには;は必須ではありません。
つまり、ifの最後についている、;は、if文の一部というより、if文の中の最後の文の一部です。
なので、最後に書かれている「文」の内容次第で、終わりが、;にも}にもなります。

投稿2020/08/28 22:52

編集2020/08/29 02:55
amiya

総合スコア1218

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

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

Zuishin

2020/08/29 01:17 編集

「他にもある」を読み飛ばしていたので削除
Zuishin

2020/08/29 01:19

しかし、わざわざ「式文」と限定する必要はなく、誤解を招く表現ではないかと思います。
amiya

2020/08/29 02:56

少し補足しました。
退会済みユーザー

退会済みユーザー

2020/08/29 05:56

とてもわかりやすく回答してくださりありがとうございます。 「文」には様々な種類があることを知りました!
guest

0

知っているべき知識

if文の構文は、
if(式)文
です。
文の一つの形は式 ;です。
式は空であることもあって、;つまり前の文が完結したあとの (空);は一つの文です。しばしば「空文」と呼ばれます。
{ }は複文で、{ }内に囲まれた0以上の文をまとめて一つの文として扱います。


以上の知識を以てif_2を解析すると、
if (条件) {文_1;};
else 文_2;

{ 文_1; }は一つの文です。
(ちなみに、{ }の中にはふたつの文が含まれています。文_1と;つまり空文です。文は式 ;のように;を含むこともありますが、完成してしまった文のあとに;が付いてもそれは文の一部ではありません。)

{ };の;も、空文で一つの文です。
つまり、ここまでで、
if (式) 文a 文b
(文aは {文_1;} 文bは;)
となっており、最初の文aまででif文は完結してしまい、文bはif文とは関係のない文です。if(式)の式の値がなんだろうと、文bは実行されます。
続いて
else 文_2;
このelseは何者でしょう。if文は既に完結してしまいました。コンパイラとしては、この「浮いた」elseはエラーにするしかありません。

文の終わりが;であることはありますが(;は文の内側)、;で終わらない文もあり({}とか、if文やfor文等々)、なんでもかんでも**「文の後に;をつける」という勘違い**があるとif_2の解釈に悩むことになる、ということでしょうか。

もしif(式)文; とおぼえているならそれが間違いです。
if(式)文です。

ついでにいうと、if(条件)という言い方にも危うさを感じます。確かにif文としてはカッコ内を「条件」として分岐をするわけですが、ここはなにか「条件」という特別な文法等があるわけではありません。単に何らかの値をもたらす式があればいいだけ。その値が0か0以外か、それが動作を分けます。
なにか「条件」という特別なものだと思っていると、ifのカッコの中には==だとか<とか>がなきゃいけない、とか思い込んだり、==とか<とか>が単なる(比較して1か0を返す)演算子ではなくて特別な記号に見えてしまったりするかも知れません。

投稿2020/08/28 22:42

編集2020/08/29 01:42
thkana

総合スコア7703

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

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

退会済みユーザー

退会済みユーザー

2020/08/29 05:59

わかりやすく回答してくださりありがとうございます。 if(条件) という表現の不適切さを指摘してくださり助かりました!
guest

0

おいても別に構いません。おいたとおりに動作をするだけです
それがあなたの期待の動作にならないかもしれませんが。

C言語の文法を学びましょう。

投稿2020/08/28 21:33

y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2020/08/29 05:59

はい
guest

0

{}; と等価です。
if (条件) {文_1;}; else 文_2;if (条件) 文_1;; else 文_2; と等価です。;が2つあることになり、2つめでif文が終了したことになります。
if (0) {printf("1\n");}printf("2\n"); を実行すると、if文が終了した部分の 2 が出力されます。

投稿2020/08/28 20:40

編集2020/08/28 21:03
shiracamus

総合スコア5406

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

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

thkana

2020/08/28 22:46

> {} は ; と等価です。 その説はちょっと乱暴だと思う...
退会済みユーザー

退会済みユーザー

2020/08/29 06:00

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問