2015-10-04 13 views
5

私は今、パスカルを探索しようとしています。そして私はいくつかのコンパイルエラーに遭遇しました。私はこのような場合はelse文場合はAを書きました:if文で何が問題になっていますか?

if ((input = 'y') or (input = 'Y')) then 
    begin 
     writeln ('blah blah'); 
    end; 
    else if ((input = 'n') or (input = 'N')) then 
    begin 
     writeln ('blah'); 
    end; 
    else 
    begin 
     writeln ('Input invalid!'); 
    end; 

そして、それは私の最初のelseでの誤差与える:

を ";"

if(boolean_expression 1)then 
    S1 (* Executes when the boolean expression 1 is true *) 

else if(boolean_expression 2) then 
    S2 (* Executes when the boolean expression 2 is true *) 

else if(boolean_expression 3) then 
    S3 (* Executes when the boolean expression 3 is true *) 

else 
    S4; (* executes when the none of the above condition is true *) 

私はbeginendを削除しようとしましたが、同じエラーが発生しました:期待が、「ELSE」私は文と、彼らは私と同じようにそれを行う場合についてのチュートリアルをたくさん探した

を見つけました。これはコンパイラのバグですか?

P.S.私はケースステートメントでこれをやっています。しかし、私はそれが重要だとは思わない。

+1

終了後にセミコロンを省略してください。 –

+0

しかし、私が始まりと終わりを削除すると、それはまだ動作しません、なぜですか? @torazaburo – Sweeper

+0

@torazaburoあなたの解決策は動作しますが、開始点と終了点を削除した後にエラーが発生するのはなぜですか? – Sweeper

答えて

9

;多くの場合、elseより前に許可されていません。

if ((input = 'y') or (input = 'Y')) then 
    begin 
     writeln ('blah blah'); 
    end 
    else if ((input = 'n') or (input = 'N')) then 
    begin 
     writeln ('blah'); 
    end 
    else 
    begin 
     writeln ('Input invalid!'); 
    end; 

がコンパイルされます。 ... ... begin ... end括弧は、複雑なコードif then elseの誤解を避けるために使用します。このような 何かが良くなる。

if ((input = 'y') or (input = 'Y')) then 
    begin 
    writeln('blah blah'); 
    end 
    else 
    begin 
    if ((input = 'n') or (input = 'N')) then 
    begin 
     writeln('blah'); 
    end 
    else 
    begin 
     writeln('Input invalid!'); 
    end; 
    end; 

第二のサンプルを読んで理解する方がはるかに簡単です、それはないですか?

およびendを削除すると、elseの前にセミコロンがあるため、コードは機能しません。これは、エラーなしでコンパイルされます:

if ((input = 'y') or (input = 'Y')) then 
    writeln('blah blah') 
    else 
    begin 

    end; 

@lurker

のコメントにを別記してください、begin ... end括弧なしで、次の例を参照してください。 DoSmth3not (expr2)または(expr2) and (not (expr3))で呼び出された場合

if expr1 then 
    DoSmth1 
    else if expr2 then 
    if expr3 then 
     DoSmth2 
    else 
    DoSmth3;//Under what conditions is it called? 

それは明らかに、ここでは見られません。このサンプルではコンパイラの動作を予測することができますが、begin ... endを除いたより複雑なコードは間違いになるので読みにくくなります。次のコードを参照してください。

//behaviour 1 
    if expr1 then 
    DoSmth 
    else if expr2 then 
    begin 
    if expr3 then 
     DoSmth 
    end 
    else 
    DoSmth; 

    //behaviour 2 
    if expr1 then 
    DoSmth 
    else if expr2 then 
    begin 
    if expr3 then 
     DoSmth 
    else 
     DoSmth; 
    end; 

コードの動作は明らかです。

+0

私はFPC vrsionについてはわかりませんが、 'string'型のスイッチャーで' case'文をサポートしています。 – Abelisto

+0

@Abelisto質問に答える私は 'if then else'文の構文だけを議論していたと仮定していました。与えられたサンプルはMCVEだけでした。さもなければ、論理式を含むコード全体がPascalプログラミング標準の点から実際には醜いことに同意する必要があります。 –

+0

突然私のコメントを批判として言及しています:)私はそのようなコードを書くために別の方法で署名します。 – Abelisto

関連する問題