2015-12-25 1 views
-1

J'ai un problème comme celui-ci Q. choisir toute erreur, vous pouvez avoir d'iciDifférence entre l'erreur d'exécution et la syntaxe

int main(void) 
{ 
    int a; 

    printf("Input a integer number >>"); 
    scanf("%d\n", a); 
    printf("The input number is %d\n", a); 
    return 0; 
} 
  1. erreur de syntaxe.
  2. erreur logique
  3. erreur d'exécution
  4. aucune erreur

Ma pensée: je pensais que c'était à la fois la syntaxe et erreur d'exécution, car la syntaxe, il n'y a pas & devant un et pour une erreur d'exécution, le programme serait toujours construit pour exécuter la première instruction d'impression et s'arrêterait soudainement à l'instruction scanf() car il n'y a pas de "&". mais ma réponse me dit que j'ai tort. Je sais que ce n'est pas une erreur logique. mais je suis confus lequel est qui ...

Répondre

0

Non, il n'y aura pas d'erreur de syntaxe ici, seulement une erreur d'exécution.

scanf() attend un pointeur vers la variable pour stocker la valeur, mais cela ne signifie pas que nous devons utiliser l'opérateur & toujours pour passer une adresse.

Figurez-vous, en cas a aurait été un pointeur (et la mémoire allouée appropriée),

scanf("%d\n", a); 

aurait été une déclaration parfaitement valable, est-ce pas?

Dans ce code, vous avez passé la valeur d'une variable non initialisée (qui se bande de roulement comme une adresse, qui sera invalide) comme argument pour le spécificateur de format %d-scanf(), de sorte que invoque undefined behavior que provoque une erreur d'exécution.

0

Les erreurs de syntaxe sont détectées par le compilateur. Ce programme compile bien, donc il n'a pas d'erreurs de syntaxe.

Toutefois, ce programme passe à la valeur d'une variable de uninitializeda-scanf, ce qui est un comportement non défini, à savoir une erreur d'exécution.