2010-01-08 4 views
11

Pourquoi le code suivant est-il compilé?Pourquoi cet extrait de code est-il compilé?

#include <stdio.h> 

int main(void) { 
    getchar; 
} 
+20

Parce que son sans erreur? –

+1

@Xinxua - +1/agree –

+0

Cela revient essentiellement à savoir si 'getchar' est autorisé à être une macro. Si c'est le cas, le code peut ne pas être correct. –

Répondre

28

Parce que les noms de fonctions sont des alias des pointeurs de fonction à ces fonctions, qui sont eux-mêmes des valeurs beaucoup plus comme des entiers .. Ceci est sémantiquement très similaire à

#include <stdio.h> 

int main(void) { 
    42; 
} 

Il est valide mais inutile.

+2

Et très ennuyeux !!!! taper "int x = getX" au lieu de "x = getX()" fonctionnera plutôt bien et mettra une valeur d'adresse aléatoire dans x. –

+0

Je déteste C.> _ <[15 char filler] – missingfaktor

+1

@Rahul: Ce n'est pas une attitude très * polyglotte *! – Tarydon

13

La même raison 1; serait la compilation, getchar est juste une adresse à une fonction. Le résultat est évalué, puis rejeté. Dans la spécification du langage, il s'agit d'une "déclaration d'expression";

2

C est bizarre, ce code compile aussi, mais il se sépare qui, pour l'enregistrement, est la plus petite erreur de ségrégation dans l'histoire C .

main; 
Questions connexes