2011-08-05 3 views
1

Chaque fois que nous appelons une fonction renvoyant une valeur, pourquoi n'est-il pas nécessaire d'intercepter la valeur? considérer le code C suivant,La fonction renvoie la valeur facultative

int main() 
{ 
     int i; 
     scanf("%d",&i); 
     printf("Value of i is: ",i); 
     return 0; 
} 

Ici scanf() renvoie la valeur 1, mais comme il est pas attrappe dans nulle part pourquoi ne pas l'erreur apparaît? Quelle est la raison pour autoriser une telle programmation?

Répondre

5

Principalement parce que les expressions en C donnent également des valeurs. Par exemple: x = 1; donne la valeur 1. Parfois, vous l'utilisez pour plusieurs affectations comme x = y = 1;, mais le plus souvent vous ne l'utilisez pas.

Au début C, le type void de retour n'a pas été inventé non plus, donc chaque fonction retourne une valeur, que ce soit généralement utile ou non (par exemple, votre appel à printf renvoie également une valeur). Les règles du langage ne font pas de cette erreur une erreur (cela pourrait perdre la compatibilité avec le code virtuellement existant) et puisque cela est commun et indique rarement un problème, la plupart des compilateurs ne l'avertissent pas non plus. Quelques outils de charpie, ce qui a conduit quelques programmeurs malavisés à écrire des choses comme (void)printf("whatever"); (c.-à-d., En renvoyant le retour inutilisé à void pour signaler que c'était vraiment, vraiment intentionnel quand il a été ignoré. et fait souvent un peu de mal, donc (heureusement) il est rarement vu

0

De nombreuses fonctions de bibliothèque renvoient des valeurs auxquelles vous ne pensez peut-être pas. Imaginez devoir utiliser la valeur de retour de chaque appel printf! (printf renvoie le nombre de caractères imprimés.)

5

Les fonctions qui retournent une valeur possèdent cette fonctionnalité pour l'utilisation et la commodité du programmeur. Si la valeur de retour ne vous intéresse pas, ne l'utilisez pas.

0

Presque toutes les fonctions c natives retournent un int. scanf et printf inclus. Ce serait vraiment ennuyeux si vous deviez toujours le "capturer" pour satisfaire le compilateur; Dans un grand programme, vous finissez par créer des milliers de variables uniquement pour stocker les valeurs de retour que vous ne regardez jamais.

+1

Notez également qu'un bon compilateur génère rnings * (!!) si vous avez fait cela, pour stocker une valeur dans une variable et ne plus jamais la lire après. C'est une indication beaucoup plus probable d'une erreur de programmation. –

0

La raison est que C n'a pas d'autre moyen de traiter les erreurs que par la valeur de retour. Ces valeurs retournées, c'est-à-dire celles qui rapportent le succès ou l'échec, devraient presque toujours être vérifiées (sauf si vous ne faites que gribouiller ou si vous avez la preuve que la fonction n'échouera pas). Maintenant, puisque les valeurs de retour sont et utilisées pour d'autres choses que le retour d'informations de succès/échec, il peut y avoir, et sont, des situations où vous ne serez pas intéressé par la valeur qu'une fonction renvoie, mais seulement les effets secondaires de l'exécution il. Dans ce cas, forcer le programmeur à inspecter/lier la valeur retournée deviendrait assez important.

+0

+1 pour le deuxième paragraphe, – nobalG

+1

Parfois, le succès/échec est également sans intérêt. Par exemple, si l'impression d'un message d'erreur échoue, qu'allez-vous faire? Imprimer un autre message d'erreur indiquant pourquoi il a échoué? Bonne chance avec ça ... :-) –

0

Simple: si vous n'utilisez pas la valeur de retour, vous ne l'utilisez pas.

Ce n'est pas obligatoire.

(Cela dit, dans un cas comme celui-ci, vous devriez . Vous ne savez pas à l'heure actuelle si scanf a rencontré une erreur)

1

Avez-vous besoin de la valeur de retour dans cet exemple? NON Donc, vous n'avez pas utilisé dans ce cas.Mais dans une autre situation, la valeur de retour peut être importante. Par exemple, si vous voulez lire aussi longtemps que certains entier disponible dans le flux d'entrée, vous pouvez faire quelque chose comme ceci:

while (scanf("%d", &i) == 1) { 
    // do something 
} 

S'il y a un EOF alors cette boucle va se rompre. Ici, la valeur de retour est nécessaire. Donc, le résumé est l'utilisation de la valeur de retour lorsque cela est nécessaire, et ne pas utiliser quand ce n'est pas nécessaire. Une telle programmation est autorisée car les deux scénarios sont possibles.

0

Chaque fois qu'une valeur est évaluée, elle doit être stockée ou renvoyée car la valeur que vous avez obtenue peut être utilisée mesure ... par exemple considérer le programm simple suivant, où nous voulons vérifier que le numéro saisi est même ou non

'int main() 
{ 
int a; 
printf("Enter a number"); 
scanf("%d",&a); 
if(a%2==0) 
printf("even number"); 
    else 
printf("odd no"); 
    return 0; 
    }' 

ici la variable « a » est pas nécessairement être retourné, parce que nous voulons juste vérifiez que le nombre est pair ou impair ... pas besoin de retourner

+0

-1 ce n'est pas C. –

+0

oh désolé, j'ai juste manqué la balise c, merci pour -1 ..:) .. @ R .. – nobalG

+0

Si vous faites quelques modifications I Je vais l'enlever. Quoi qu'il en soit, la raison pour laquelle je considère cela comme une mauvaise réponse est que, sur des problèmes comme ceux-ci qui concernent les avertissements contre les erreurs et qui interdisent les choses que d'autres programmeurs considèrent comme les meilleures pratiques, c'est en fait une des grandes différences. C. –

Questions connexes