2011-07-07 27 views
8

En el lenguaje de programación C, es posible omitir un bloque de código en el caso de un único estado, por ejemplo:Sintaxis: Declaración individual de declaración de la función

if(1) exit(); 

Ahora bien, ¿esto sólo se aplica a los condicionales ? ¿Por qué es esto no válida en el caso de funciones:

void f(int a) exit(); 
+4

Porque el estándar lo dice? –

+1

nunca lo intenté, pero supongo que, si no está permitido, es solo una cuestión de sintaxis, tal vez legado: una vez que haya escrito nulo f (a) int a; {...}, entonces {} fueron necesarios para marcar el final del bloque de declaración de tipo de argumento ... tal vez ... – ShinTakezou

+0

gracias, sabía de la antigua sintaxis de la función, pero esto también significa que los compiladores pueden analizar correctamente este entonces ... – overscore

Respuesta

18

Es una característica de la sintaxis C. En BNF, una definición de función es algo así como

FUNC_DEF ::= TYPE IDENTIFIER "(" PARAM_LIST ")" BLOCK 

mientras que una declaración es

STATEMENT ::= (EXPRESSION | DECLARATION | CONTROL |) ";" | BLOCK 
BLOCK ::= "{" STATEMENT* "}" 

(simplificando para permitir declaraciones y declaraciones entremezcladas, que C++ permite pero C no lo hace), y un estado de if es

CONDITIONAL ::= "if" "(" EXPRESSION ")" STATEMENT 

omitiendo la pieza else por el momento.

La razón de esto es que de lo contrario, se podría escribir la función

void no_op() {} 

como

void no_op(); 

pero este último sintaxis ya está en uso para denotar una declaración.

+1

+1 para el razonamiento no tan obvio! –

+0

Creo que es una pregunta intransitiva desde el punto de vista del analizador C. Porque no veo ninguna contradicción en la segunda declaración para el analizador sintáctico. Pero de cualquier manera +1 –

+0

¡Gracias! Este es exactamente el tipo de respuesta que estaba buscando, ¡y me recuerdas por qué me gusta CS! – overscore

4
  • La sintaxis de una sentencia condicional es la siguiente:

    if(expression) statement 
    
  • Una sentencia compuesta es una declaración.

  • Un compound statement se define como

    { zero or more statements } 
    
  • La sintaxis de una definición de función es este

    function_declaration compound_statement 
    
  • Por lo tanto, por definición, un cuerpo de la función debe ser una sentencia compuesta y tienen {}

  • QED :)

1

Hay un dialecto muy antigua de C, el K & R C. En este dialecto la declaración de función puede tener este aspecto:

fun_a(a,b) 
char a; 
float b; 
{ 
     fun_b(b,a); 
} 

Creo que sería ser demasiado difícil de analizar sin { y }.

+0

Esta es probablemente la razón histórica, +1, pero también hay una razón por la cual la sintaxis no ha cambiado en ANSI C. –

Cuestiones relacionadas