Notice : 内容無保証。禁無断転載。リンク自由。

こらむ1 セミコロンの打ち方 (悩める Pascal 経験者に贈る)

えー、C言語を使った急ぎの仕事があるという方は、 ここを読まないほうが良いかとおもいます。(^_^)

Pascal を知っていて、C言語のセミコロンの打ち方が気に食わない と思っている方に読んでいただけると、お役にたてるかも。


皆さん、セミコロンをどこに打つかで悩んだ経験はありませんか?

「そんなの簡単だよ、文の終わりに打てばいいのさ。」

と言われるかもしれませんが、 私は入社当時これで随分悩みました。

  1. if 文の終わりはどこ?

    まず、例を見ていきましょう。

    if (condition)
        action() ;

    では、action() の後にセミコロンが必要ですよね。

    ところが if で制御する文が複数になった場合、

    if (condition) {
        action_0() ;
        action_1() ;
    }

    } の後に、セミコロンはいりません。

    セミコロンを付けても、 後に else が続かない場合は問題ないのですが、 else が続く場合、

    if (condition) {
        action_0() ;
        action_1() ;
    } ;
    else
        otherAction() ;

    とやってしまうと、if 文が } ; の部分で終わってしまうので、

    "if が無いのに、else が出てきた"

    とかいうコンパイルエラーになるでしょう。

    じゃあ、elseの前にセミコロンを打ってはならないかというと、

    if (condition)
        action()
    else
        otherAction() ;

    これでは action() の後にセミコロンが無いため、 エラーになってしまいます。

    if (condition)
        action() ;
    else
        otherActhion() ;

    こう書かなければなりません。

    どうして action() ; までで if 文が終わらないのでしょう?

  2. 文とは何か - 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
  3. 文とは何か - C言語では..

    if 文の文法をおさらいしましょう。

    if (条件式)
        文
    [else
        文]

    おや?、セミコロンは出てきませんね。 Pascal と同じです !? しかし、例でのセミコロンの使い方は明らかに違っていましたが ??

    では、

    if (condition)
        action() ;

    上の例で、action() は文でしょうか? 文だとすると セミコロンは何でしょう?

    ? ? ? ? ? ?

    実は、Pascal と C言語では、"文" の定義が違うのです。

    文法的には、"action()" は "式"、 "action() ;" は "文" ("単文" or "式文") と呼ばれます。 セミコロンは文を完結させるためのターミネータです。

    (だから、C言語でひとつの文を表すつもりで、 "文 ;" と書くのは誤りです。 これでは、 文 + 空文 になってしまいます。)

    "複合文" は もちろん "文" であって、 つぎのような形をしています。

    { 文 文 ... 文 }

    # こいつがセミコロンでターミネイトされないので気持ち悪い
    # ことになる。マクロが書きづらくてかなわん。

    "文" の定義が解ってみると、 たしかに始めの例は文法どおりですね。

  4. まとめ

    まとめると、

    Pascal のセミコロンは セパレータ、
    C言語 のセミコロンは ターミネータ である。

    Pascal では、セミコロンは文の一部ではない。
    C言語 では、セミコロンは文の一部。

    ただし、C言語の複合文は } で終わり。
    (セミコロンがいらない)

    こんなとこでしょうか? 最後の但し書きが、C言語らしくて良いですね :-P

  5. 後学のために (キーワードだけ - サポートしきれないから)

    構文図
    BNF
    yacc, lex
    正規表現 (広げすぎかしらん)


[ <前 ][ 目次 ][ 次> ]
トップページに戻る