2016-05-04 3 views
0

J'ai du mal à comprendre les réponses à cette question.Entièrement dactylographié au moment de la compilation

Donner le code suivant:

int: size, size2, j; 
float: x; 
array[1:30] of int: nums; 

Pour chaque instruction d'affectation ci-dessous, le cercle peut ou ne peut pas dire si elle peut ou ne peut pas être de type vérifiée entièrement au moment de la compilation. Supposons que la plage d'indice d'un tableau est considérée comme faisant partie de son type. Supposons que le dépassement numérique n'est pas considéré comme une erreur de type.

A. size = size2 + 1; --> Answer: CAN 
B. x = size; --> Answer: CAN 
C. nums[j] = 33; --> Answer: CANNOT 
D. nums[3] = nums[4]; --> Answer: CAN 
E. nums[j] = nums[j+1]--> Answer: CANNOT 

Maintenant, compilez les erreurs de temps se produisent lorsque le programme est en cours de conversion en code machine où ces erreurs d'exécution se produisent lors de l'exécution d'un programme. J'ai également lu sur la question de débordement de pile suivante concernant les erreurs de compilation et d'exécution: Runtime vs Compile time. Après avoir étudié les deux sujets, je suis toujours confus comment les réponses suivantes ont été dérivées. Toute aide serait très appréciée.

Répondre

0

Je crois que la question demande si le vérificateur de type "peut"/"ne peut pas" attraper l'erreur logique au moment de la compilation.

Le vérificateur de type sait avec certitude que A, D sont valides et B est invalide (en supposant qu'il n'y a pas de conversion implicite), de sorte que le vérificateur de type CAN détermine la validité de ces trois instructions.

Cependant, pour C et E, la validité dépend de la valeur réelle de j (par exemple, ils sont valides lorsque j == 1 et invalides lorsque j == 100). Ainsi, le vérificateur de type NE peut PAS déterminer si C et E sont valides (parce que "la plage d'indice d'un tableau est considérée comme faisant partie de son type").


Notez que ces réponses sont basées sur l'hypothèse que le vérificateur de type est incapable de déterminer/ne se soucie pas de la plage de valeurs de j. Certains langages comme Ada et Pascal supportent le type "range", donc les vérificateurs de type peuvent en principe vérifier statiquement si C (exigeant j ayant le type int range 1:30) et E (exigeant j ayant le type int range 1:29) sont valides.