2010-08-14 9 views
6

Estaba leyendo una pregunta sobre SO en Python y noté la falta de paréntesis en un bucle for. Me pareció agradable, entonces me pregunté: ¿por qué C# los requiere?¿Por qué C# requiere parens en condicionales?

Por ejemplo, actualmente hay necesidad de escribir:

if (thing == stuff) { 
} 

y

foreach (var beyonce in allthesingleladies) { 
} 

Así que me pregunto por qué no puedo escribir:

if thing == stuff { 
} 

¿Existe una sintáctica ambigüedad en esa declaración que desconozco?

PS, curiosamente, los apoyos pueden ser opcional para una sola línea:

if (thing == stuff) 
    dostuff(); 
+0

i obj-c y php y no es necesario utilizarlo si a veces. : p solo mi 2p. –

+0

@Ardman: el OP se refiere al '()' no al '{}' - pero el PS confunde las cosas. – ChrisF

+0

@Ardman: para ser claros, solo se requieren llaves si incluye * más de una declaración * después del 'si' (las declaraciones individuales pueden abarcar varias líneas). –

Respuesta

8

El sistema necesita alguna forma de saber cuándo se detiene la condición y comienza la instrucción. Eso significa que los paréntesis alrededor de la condición son opcionales, o los refuerzos alrededor de la declaración son opcionales. Los diseñadores de C# eligieron hacer las llaves opcionales (en el caso de que haya una sola declaración).

Considera:

if x == 12 - x == 3 ? x++ : x--; 

Un analizador podría escribirse que puede decir dónde termina la condición y el estado se inicia, pero que requieren los paréntesis hace que sea sustancialmente más fácil. En el caso de mi ejemplo, la gramática indica que la declaración completa es if (x == 12) { -x == 3 ? x++ : x--; }. Sin embargo, no sabes que el - es el comienzo de la instrucción hasta que toques el segundo ==, que ya tiene 3 símbolos.

Dado que el análisis correcto de dichos ejemplos requiere buscar un número arbitrario de tokens en el flujo de entrada (y posiblemente haga que el código sea más difícil de leer para los humanos), hay una buena razón para requerir los parens.

+0

No está equivocado, pero de acuerdo con el BNF, hay * siempre * una sola declaración en el "entonces "cláusula. El truco es que puede ser una declaración compuesta, con cierto número de sentencias contenidas entre sus curlies. –

+0

Esto es cierto. Sin embargo, todavía no responde a la pregunta de por qué no * se puede omitir *, siempre que * ambos * no lo sean. Ninguno de los dos últimos ejemplos de OP es ambiguo: ¿por qué solo se permite uno de ellos? (Pregunta más como una pregunta retórica ...) –

+0

ah, buen punto. Pensé que las llaves eran solo una interesante pieza de trivia, pero tienes razón, no puedes tener llaves opcionales * y * paréntesis opcionales. –

0

Es una opción de diseño lenguaje que venía de Java, que a su vez procedía de C++ que a su vez procedía de C, que a su vez procedía de ???

Python no necesita brazales ya que la indention muestra la intención. F # hace lo mismo. Es una buena idea (IMO).

+0

Python requiere dos puntos para indicar el comienzo de la instrucción adjunta; F # usa 'do' o' then'. – Gabe

+0

C vino de [B] (http://en.wikipedia.org/wiki/B_%28programming_language%29) –

2

[Sé que voy probable que su flameado para esto, pero tengo que decir que de todos modos]

Como programador predominantemente vb que es una cosa que me molesta al hueso. En mi opinión, los paréntesis deben ser opcionales y las llaves son obligatorias. Si es demasiado pedir, entonces Microsoft podría 'tomar prestado' de vb en C# al introducir un equivalente C# de Then de vb.

Pero entonces ¿para qué molestarse? Microsoft diseñó C# basado en C, C++ y Java, todos los cuales ponen la condición if en parens entonces ¿por qué C# debería ser diferente?


Editar

Honestamente, creo que en base a 'la adopción de C# 4 de los parámetros opcionales y con nombre, una característica que siempre ha estado en VB (por lo menos desde Visual Basic 6), la próxima versión de C# (C# 5.0, eso es) también podría introducir una característica 'nueva' para que no tenga que escribir paréntesis innecesarios.

Dado que hay un ternario if condition ? truePart : falsePart, que tiene if condition then something o para aquellos que no están en C# pareciendo vb, if condition do something no sería una mala idea.

+1

Como ex programador de VB, yo también habría encontrado irritantes los parens (y llaves, para el caso). Pero como programador de C# reformado, descubro que, para mí, los paréntesis y paréntesis hacen que leer el código sea más fácil, ya que actúan visualmente como publicaciones de valla (parens y llaves son visualmente distintas de las palabras). Hoy encuentro que leer VB es incómodo, pero supongo que se trata de algo a lo que estás acostumbrado (o que usas actualmente, tal vez). –

+0

Acepto que encuentro que la puntuación hace que sea más fácil de leer. Los idiomas que usan palabras para la puntuación (como COBOL o VB) son más difíciles de leer. – Gabe

+3

VB tiene parens también, la palabra clave Then. Usar puntuación en lugar de palabras clave es simplemente una preferencia de estilo. –

4

Es una "característica" de sintaxis que se remonta a C, y tal vez a algún lenguaje anterior a eso.

Esencialmente fue una elección entre

if (condition) statement; 

y

if condition then statement; 

En el momento en que fue concebido C, notación más corta y menos palabras eran la tendencia.

0

Por cierto, si tuviera mi druthers, permitiría un operador fuera de los parens: un signo de exclamación principal. Me molesta que las pruebas de código para condiciones negativas complicadas terminen con un par de paréntesis adicionales en comparación con las pruebas de código para los complicados positivos.

+0

Estoy de acuerdo, 'if!' Es una forma agradable y más corta de decir 'a menos'. – Gabe

0

En pocas palabras, se debe a cómo C/C++/C# maneja el espacio en blanco. Necesita algún tipo de delimitador ya que las sentencias pueden abarcar varias líneas. También necesita una forma de "bloquear" o agrupar declaraciones en un bloque.

  • C/C++/C# usar() 's, {}' s
  • VB/VB.NET/VBScript/VBA usar Función/End Function Sub, Sub/fin, If/Then/Else/Else If/End If, y entonces en. (Solo para el bloqueo, ya que los lenguajes basados ​​en VB no admiten sentencias que abarcan varias líneas)

Si su pregunta específica, está utilizando() para crear una expresión. Por lo tanto, necesita una forma de decirle al compilador que ha terminado con la expresión, ya que {} (delimitadores de bloqueo) no son necesarios.

Cuestiones relacionadas