¿Esta declaración IF está anidada o no?

votos
0

entrada X:

if (0 <= X and X < 49)
    output abc
else if (50 <= X and X < 70)
    output def
else if (70 <= X and X < 85)
    output ghi
else if (85 <= X and X < 100)
    output jkl
endif
Publicado el 11/04/2009 a las 00:47
fuente por usuario
En otros idiomas...                            


9 respuestas

votos
-1

En edición: no importa, estaré de acuerdo en que fui rechazado en este caso.

No lo es, porque no ifse prueba dentro de otro ifque fue probado true.

En particular, tu ejemplo:

if (0 <= X and X < 49) output "abc"

else if (50 <= X and X < 70) output "def"

else if (70 <= X and X < 85) output "ghi"

else if (85 <= X and X < 100) output "jkl"

endif

podría ser reescrito como:

if (0 <= X and X < 49) output "abc"; return; end if

if (50 <= X and X < 70) output "def"; return; end if

if (70 <= X and X < 85) output "ghi"; return; end if

if (85 <= X and X < 100) output "jkl"; return; end if

// X < 0 or X >= 100

Comentario:

Una instrucción if no tiene que estar anidada dentro de otra si se debe anidar. Se puede anidar dentro de otro -Bill the Lizard

Punto a favor; Estoy de acuerdo en que estoy equivocado en este caso.

Respondida el 11/04/2009 a las 00:51
fuente por usuario

votos
8

Podría pensar que es lógicamente equivalente a lo siguiente:

if(a) {
    // code
} else {
    if(b) {
        // code
    } else {
        // code
    }
}

Entonces, a este respecto, podrías llamarlo anidado. En C y en lenguajes similares, así es exactamente como funciona, ya que no hay ninguna declaración "elseif" disponible. Sin embargo, las llaves son opcionales, solo las incluí para aclararlas.

Respondida el 11/04/2009 a las 00:56
fuente por usuario

votos
0

Podría implementarse como un bucle anidado, según el idioma. Sin embargo, la forma en que lo escribió lógicamente, no sería considerado uno.

Respondida el 11/04/2009 a las 01:11
fuente por usuario

votos
5

Están anidados, pero formateados como no lo son.

Tu código es el mismo que:

if (0 <= X and X < 49)
    output "abc"
else
    if (50 <= X and X < 70)
        output "def"
    else
        if (70 <= X and X < 85)
            output "ghi"
        else
            if (85 <= X and X < 100)
                output "jkl"
            endif
        endif
    endif
endif

Esto no está anidado:

if (0 <= X and X < 49)
    output "abc"
endif
if (50 <= X and X < 70)
    output "def"
endif
if (70 <= X and X < 85)
    output "ghi"
endif
if (85 <= X and X < 100)
    output "jkl"
endif

Esto es válido en todos los idiomas (?) Que tienen sentencias if (ignorando cosas como usar {} en lugar de endif)

Sin embargo, algunos lenguajes tienen un comando real "elseif" (o "elif"), en cuyo caso no anidará, pero escrito como "else if" puede suponer que se trata de un nido con un formato diferente.

Respondida el 11/04/2009 a las 01:11
fuente por usuario

votos
3

Depende del idioma real y de cómo está escrito.

Por ejemplo, usando VB, estas Ifdeclaraciones no están anidadas:

If 0 <= x And x < 49 Then
    output("abc")
ElseIf 50 <= x And x < 70 Then
    output("def")
ElseIf 70 <= x And x < 85 Then
    output("ghi")
ElseIf 85 <= x And x < 100 Then
    output("jkl")
End If

Si bien estas Ifdeclaraciones están anidadas:

If 0 <= x And x < 49 Then
    output("abc")
Else
    If 50 <= x And x < 70 Then
        output("def")
    Else
        If 70 <= x And x < 85 Then
            output("ghi")
        Else
            If 85 <= x And x < 100 Then
                output("jkl")
            End If
        End If
    End If
End If
Respondida el 11/04/2009 a las 01:17
fuente por usuario

votos
3

Yo diría que sí, están anidados. Tu código es exactamente equivalente a

if (0 <= X and X < 49)
    output "abc"
else
    if (50 <= X and X < 70)
        output "def"
    else
        if (70 <= X and X < 85)
            output "ghi"
        else
            if (85 <= X and X < 100)
                output "jkl"
endif

Tenga en cuenta que solo he cambiado el espacio en blanco. Cuando un lenguaje evalúa if...else if...elsecláusulas, las prueba cada una hasta que encuentra la cláusula verdadera (o llega a la final else). Los ifs anidados se evalúan exactamente de la misma manera. También tenga en cuenta que este no es necesariamente el caso si hay una elsifpalabra clave explícita .

Una cosa más que noto, lo siguiente no es equivalente a tu código:

if (0 <= X and X < 49)
    output "abc"

if (50 <= X and X < 70)
    output "def"

if (70 <= X and X < 85)
    output "ghi"

if (85 <= X and X < 100)
    output "jkl"

La anidación es necesaria para evitar que todo el texto se emita cuando todas las condiciones son verdaderas.

Respondida el 11/04/2009 a las 01:20
fuente por usuario

votos
1

Dada la sintaxis mostrada, creo que la respuesta debería ser "No", en contra de la sabiduría acumulada de las otras respuestas.

Mostrar:

if (0 <= X and X < 49)
    output "abc"
else if (50 <= X and X < 70)
    output "def"
else if (70 <= X and X < 85)
    output "ghi"
else if (85 <= X and X < 100)
    output "jkl"
endif

Se trata claramente de una sola if... endifdeclaración, y por lo tanto no hay anidación. Si hubiera múltiples endifinstrucciones, estaría anidada:

if (0 <= X and X < 49)
    output "abc"
else
    if (50 <= X and X < 70)
        output "def"
    else
        if (70 <= X and X < 85)
            output "ghi"
        else
            if (85 <= X and X < 100)
                output "jkl"
            endif
        endif
    endif
endif

Por lo tanto, en su idioma, parece que la palabra clave elif(utilizada por el shell Bourne) y elsif(utilizada por Perl) y ElseIf(utilizada por Visual Basic) está deletreada else if.

Si no hubiera un texto explícito endifpara marcar el final del enunciado, estaría de acuerdo con las otras respuestas: que las ifdeclaraciones (¡en plural!) Están anidadas, aunque el diseño es perfectamente razonable y recomendable.

Respondida el 11/04/2009 a las 01:45
fuente por usuario

votos
0

No, no es.

Una declaración anidada es aquella que aparece dentro de una misma declaración, como If ... If. Si ... De lo contrario, está todo en la misma "declaración".

Respondida el 11/04/2009 a las 01:54
fuente por usuario

votos
1

Este es un juego semántico sin sentido; depende de la sintaxis del idioma involucrado.

Por ejemplo, en una sintaxis similar a C, por lo general se considerarían anidados en las cláusulas else, con las llaves omitidas para ocultar ese hecho. En este caso, el ejemplo de Turnor es correcto.

En algunos otros lenguajes, como Python y VB, 'else-if' es una construcción atómica propia. En ese caso, no se puede considerar que el 'si' está dentro del 'else', por lo que no se puede llamar "anidado".

if (0 <= X and X < 49)
    output "abc"
else if (50 <= X and X < 70)
    output "def"
endif

No has definido la sintaxis de tu pseudocódigo lo suficiente como para decirlo con seguridad, pero el 'endif' final es sospechoso. Su existencia no encaja con el estilo C-llaves-omitido; y el hecho de que solo hay uno de ellos y no más,

else
    if (50 <= X and X < 70)
        output "def"
    endif
endif

- significa que tampoco coincide con el modelo de llaves (o comenzar / finalizar). A juzgar por esa sintaxis, colocaría su lenguaje de pseudocódigo en el campo "atomic else-if", y diría bastante arbitrariamente: No, su instrucción if no está anidada.

(Pero siempre podría haber definido un idioma donde endifs son opcionales o dependientes del espacio en blanco. O bien, podría haber definido un idioma en el que el programa anterior imprime "Hello world", luego borrará todos sus archivos y tiene un lector de correo incorporado. )

Respondida el 11/04/2009 a las 02:50
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more