Differenze nell'istruzione If ... Else ...

5

Quando ho iniziato a imparare la programmazione, ricordo di aver avuto una discussione con il mio insegnante sulle affermazioni di If Else. Stavo sostenendo che:

 if {
      ...
 } else if {
      ...
 } ...

è fondamentalmente lo stesso di:

 if {
      ...
 else {
      if {
           ...
      } else {
           if {
                ...
           } else {
                ...
           }
      }
 } 

ma ha detto che erano completamente diversi. Dopo un po 'di discussione ho accettato che sono diversi. Ora, nel corso degli anni sono tornato a questo e ho guardato su di loro per vedere l'evidente differenza principale ma per la vita di me non riesco a vederlo.

Qualcuno può chiarire perché esattamente sono diversi (a parte l'ovvio nidificazione)

    
posta Skepi 04.02.2013 - 11:26
fonte

4 risposte

10

Sono logicamente equivalenti e ottengono la stessa cosa, è solo un modo diverso di formattare il codice. La differenza dipende generalmente dalla leggibilità del tuo codice. Trovo le dichiarazioni di% co_de nidificate più difficili da leggere personalmente e cerco di evitarli.

Queste dichiarazioni sono le stesse:

if (condition1)
  //block 1
else if (condition2)
  //block 2

if (conditon1)
   //block 1
else
    if (condition2)
        //block 2

Entra in gioco un'altra differenza (la leggibilità, ricorda - sono gli stessi una volta compilati) è dove hai nidificato if s senza if s, poiché diventano equivalenti alle dichiarazioni else :

if (condition1)
    if(condition2)
       //do something

È lo stesso di:

if (condition1 && condition2)
    //do something
    
risposta data 04.02.2013 - 11:39
fonte
5

Scriverò sulla differenza sintattica, poiché entrambe le forme sono semanticamente equivalenti (cioè entrambi i programmi calcolano lo stesso risultato per ogni possibile input).

Un if - else -statement verrà rappresentato nell'albero della sintassi astratta (AST) come nodo con tre figli. Una è la condizione, una è l'istruzione da eseguire se le condizioni valutano a true e una è l'istruzione che deve essere eseguita se le condizioni valutano a false . L'osservazione importante qui è che entrambe le dichiarazioni sono singole dichiarazioni. Quindi cosa fai se vuoi eseguire più di una dichiarazione? Si utilizza un blocco e i blocchi sono contrassegnati con parentesi graffe in Java. Una dichiarazione di blocco può contenere arbitrariamente molte istruzioni (ciascuna separata da un punto e virgola).

Quindi nel tuo primo esempio il parser (oltre a lamentarsi della condizione mancante) interpreterà il tuo input come un if -node con un'istruzione di blocco come "then" -statement e un secondo if -statement come else -affermazione. Nel secondo esempio il parser riconoscerà nuovamente un if -statement con un blocco come "then" -statement e una seconda istruzione di blocco (con solo un singolo if -statement in esso) come else -statement.

    
risposta data 04.02.2013 - 13:06
fonte
3

Logicamente le due istruzioni if-else sono uguali. Avranno lo stesso risultato.

La differenza è nella loro semantica. Scrivendo

 if(condition 1) {
 ...
 } else if(condition 2) {
 ...
 else if(condition n) {
 ...
 }

intendi che condition 1 , ... condition n sono uguali (si riferiscono alla stessa condizione o stato).

Istruzioni come

 if(condition) {
 ...
 } else {
 // nested if-else statements here
 ... 
 }

supponi che condition abbia solo due stati equivalenti (ad esempio if(x > 0) { } else {} ).

Quando hai bisogno di due scegli tra i due, la priorità dovrebbe essere la leggibilità, e la seconda affermazione è raramente preferibile.

    
risposta data 04.02.2013 - 11:41
fonte
2

Come altri utenti hanno detto che entrambi sono logicamente uguali, ma vengono utilizzate diverse rappresentazioni in base ai tuoi input. Per cose semplici "se ... altrimenti se" sono sufficienti, ma per quelle complesse annidate "if ... else" avrebbe più senso ed è facilmente leggibile.

Ad esempio, assumiamo che stiamo controllando se un input è stringa / numero / carattere speciale dopo di che controlleremo se è in maiuscolo / minuscolo per stringa, positivo / negativo per numero e qualche altro controllo per caratteri speciali.

Ora scrivilo in entrambe le rappresentazioni.

Rappresentazione - 1

if (input is number && input is positive)
{
...
}
else if (input is number && input is negative)
{
...
}
else if (input is string && input is in uppercase)
{
...
}
else if (input is string && input is in lowercase)
{
...
}
else if (input is special-char && input is a currency-symbol)
{
...
}
else if (input is special-char && input is an-operator)
{
...
}
else
{
...
}

Rappresentazione - 2

if (input is number)
{
    if (number is positive)
    {
    ...
    }
    else
    {
    ...
    }
}
else if (input is string)
{
    if (string is in uppercase)
    {
    ...
    }
    else
    {
    ...
    }
}
else if (input is special-char)
{
    if (special-char is currency symbol)
    {
    ....
    }
    else
    {
    ...
    }
}
    
risposta data 04.02.2013 - 12:44
fonte

Leggi altre domande sui tag