えー、C言語を使った急ぎの仕事があるという方は、 ここを読まないほうが良いかとおもいます。(^_^)
Pascal を知っていて、C言語のセミコロンの打ち方が気に食わない と思っている方に読んでいただけると、お役にたてるかも。
皆さん、セミコロンをどこに打つかで悩んだ経験はありませんか?
と言われるかもしれませんが、 私は入社当時これで随分悩みました。
if 文の終わりはどこ?
まず、例を見ていきましょう。
if (condition)
action() ;
では、action() の後にセミコロンが必要ですよね。
ところが if で制御する文が複数になった場合、
if (condition) {
action_0() ;
action_1() ;
}
} の後に、セミコロンはいりません。
セミコロンを付けても、 後に else が続かない場合は問題ないのですが、 else が続く場合、
if (condition) {
action_0() ;
action_1() ;
} ;
else
otherAction() ;
とやってしまうと、if 文が } ; の部分で終わってしまうので、
とかいうコンパイルエラーになるでしょう。
じゃあ、elseの前にセミコロンを打ってはならないかというと、
if (condition)
action()
else
otherAction() ;
これでは action() の後にセミコロンが無いため、 エラーになってしまいます。
if (condition)
action() ;
else
otherActhion() ;
こう書かなければなりません。
どうして action() ; までで if 文が終わらないのでしょう?
文とは何か - Pascal の例
Pascal の if 文の文法は、
if 条件式 then 文 [else 文]
となっています。
以下に、いくつか例を示します。
# しばらく使ってなかったから、
# スタイルがぐしゃぐしゃやー (;_;)
(a)
if condition then
action
(b)
if condition then begin
action_1 ;
action_2
end
begin は C言語の { 、 end は C言語の } とほぼ同じで、複合文を作るためのものです。 Pascalの複合文は次のような形をしています。
begin 文 ; 文 ; ... ; 文 end
次に、else節 のある例。
(c-1)
if condition then
action
else
otherAction
(c-2)
if condition then begin
action_1 ;
action_2
end
else begin
otherAction_1 ;
otherAction_2
end
この場合、else節 が続くので、 then節 の終わりにセミコロンを打ってはなりません。
Pascal のセミコロンは、
文と文とを分けるセパレータです。
例えば、(a) に別の文が続く場合、
次のようにセミコロンが必要になります。
(d)
if condition then
action ;
otherAction
文とは何か - C言語では..
if 文の文法をおさらいしましょう。
if (条件式) 文 [else 文]
おや?、セミコロンは出てきませんね。 Pascal と同じです !? しかし、例でのセミコロンの使い方は明らかに違っていましたが ??
では、
if (condition)
action() ;
上の例で、action() は文でしょうか? 文だとすると セミコロンは何でしょう?
? ? ? ? ? ?
実は、Pascal と C言語では、"文" の定義が違うのです。
文法的には、"action()" は "式"、 "action() ;" は "文" ("単文" or "式文") と呼ばれます。 セミコロンは文を完結させるためのターミネータです。
(だから、C言語でひとつの文を表すつもりで、 "文 ;" と書くのは誤りです。 これでは、 文 + 空文 になってしまいます。)
"複合文" は もちろん "文" であって、 つぎのような形をしています。
{ 文 文 ... 文 }
# こいつがセミコロンでターミネイトされないので気持ち悪い
# ことになる。マクロが書きづらくてかなわん。
"文" の定義が解ってみると、 たしかに始めの例は文法どおりですね。
まとめ
まとめると、
Pascal のセミコロンは セパレータ、
C言語 のセミコロンは ターミネータ である。
Pascal では、セミコロンは文の一部ではない。
C言語 では、セミコロンは文の一部。
ただし、C言語の複合文は } で終わり。
(セミコロンがいらない)
こんなとこでしょうか? 最後の但し書きが、C言語らしくて良いですね :-P
後学のために (キーワードだけ - サポートしきれないから)
構文図
BNF
yacc, lex
正規表現 (広げすぎかしらん)