2015-10-04 15 views
5

Ora sto cercando di esplorare pascal. E mi sono imbattuto in alcuni errori del compilatore. Ho scritto un if else if in questo modo:Cosa c'è di sbagliato nella mia dichiarazione 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; 

E mi dà un errore alla prima else:

";" previsto, ma "ELSE" trovato

Ho cercato un sacco di tutorial su se le dichiarazioni e hanno appena fanno come me:

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 *) 

ho cercato di cancellare il begin e end ma lo stesso errore ha accaduto . È un bug del compilatore?

P.S. Lo sto facendo in una dichiarazione di un caso. Ma non penso che importi.

+1

Provare ad omettere punto e virgola dopo la fine. –

+0

Ma quando cancello l'inizio e la fine non funziona ancora, perché? @torazaburo – Sweeper

+0

@torazaburo la soluzione funziona, ma perché ricevo un errore dopo aver rimosso l'inizio e la fine? – Sweeper

risposta

9

; non è consentito prima di else nella maggior parte dei casi.

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; 

verrà compilato. Ma ... Preferisco usare le parentesi per evitare equivoci di codice nelle complicate dichiarazioni if then else. qualcosa di simile sarà migliore:

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; 

Il secondo campione è molto più facile da leggere e capire, non è vero?

Il codice non funziona quando si rimuovono begin e end perché c'è un punto e virgola prima di else. Questo compilerà senza errori:

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

    end; 

allegati al commento di @lurker

prega, vedere l'esempio seguente, senza begin ... end parentesi.

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

Non si vede chiaramente qui, se DoSmth3 è chiamato not (expr2) o (expr2) and (not (expr3)). Anche se possiamo predire il comportamento del compilatore in questo esempio, il codice più complicato senza begin ... end diventa un sottopunto agli errori ed è difficile da leggere. Vedere il seguente codice:

//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; 

Ora il comportamento del codice è evidente.

+0

BTW Non sono sicuro della versione di FPC ma supporta l'istruzione 'case' con lo switcher' stringa'. – Abelisto

+0

@Abelisto Rispondere alla domanda Supponevo che stessimo discutendo solo della sintassi dell'istruzione 'if then else' e ​​che il campione fornito non era altro che MCVE.Altrimenti, dobbiamo convenire che l'intero codice, incluse le espressioni booleane, è davvero brutto dal punto di vista degli standard di programmazione Pascal. –

+0

All'improvviso mi parli del mio commento come critica :) Ho appena firmato un altro modo per scrivere questo codice. – Abelisto

Problemi correlati