2010-01-08 22 views
11

¿Por qué compila el siguiente código?¿Por qué compila este fragmento de código?

#include <stdio.h> 

int main(void) { 
    getchar; 
} 
+20

¿Porque está libre de errores? –

+1

@Xinxua - +1/acuerdo –

+0

Básicamente se reduce a si se permite que 'getchar 'sea una macro. Si es así, el código puede no ser correcto. –

Respuesta

28

Dado que los nombres de función son alias de los punteros de función a esas funciones, que son en sí mismos valores mucho como números enteros .. Esta es semánticamente muy similar a

#include <stdio.h> 

int main(void) { 
    42; 
} 

Es válido, pero sin sentido.

+2

y muy molesto !!!! escribir, "int x = getX" en lugar de "x = getX()" funcionará muy felizmente y pondrá algún valor de dirección aleatoria en x. –

+0

Odio C.> _ <[15 carbonilla] – missingfaktor

+1

@Rahul: ¡Esa no es una actitud muy * políglota *! – Tarydon

13

La misma razón 1; compile, getchar es sólo una dirección a una función. El resultado se evalúa, luego se descarta. En la especificación del lenguaje, se llama una "declaración de expresión";

2

C es extraño, este código se compila también, pero segfaults que para el registro, es el segfault más pequeño en C historia.

main; 
Cuestiones relacionadas