web-dev-qa-db-fra.com

Pourquoi devons-nous mentionner le type de données de la variable en C

Habituellement en C, nous devons dire à l'ordinateur le type de données dans la déclaration variable. Par exemple. Dans le programme suivant, je souhaite imprimer la somme de deux numéros de points flottants x et Y.

#include<stdio.h>
main()
{
  float X=5.2;
  float Y=5.1;
  float Z;
  Z=Y+X;
  printf("%f",Z);

}

Je devais dire au compilateur le type de variable X.

  • Le compilateur ne peut-il pas déterminer le type de X seul?

Oui, ça peut si je fais ça:

#define X 5.2

Je peux maintenant écrire mon programme sans dire au compilateur le type de X comme:

#include<stdio.h>
#define X 5.2
main()
{
  float Y=5.1;
  float Z;
  Z=Y+X;
  printf("%f",Z);

}  

Nous voyons donc que c langue a une sorte de fonctionnalité, en utilisant laquelle il peut déterminer le type de données à lui seul. Dans mon cas, il a déterminé que X est de type flotteur.

  • Pourquoi devons-nous mentionner le type de données, lorsque nous déclarons quelque chose dans Main ()? Pourquoi le compilateur ne peut-il pas déterminer le type de données d'une variable à part entière dans main() comme dans #define.
19
user106313

X Dans le deuxième exemple n'est jamais un flotteur. Il s'appelle une macro, il remplace la valeur macro définie "X" dans la source avec la valeur. Un article lisible sur #define est ici .

Dans le cas du code fourni, avant la compilation, le prétraitement change le code

Z=Y+X;

à

Z=Y+5.2;

et c'est ce qui est compilé.

Cela signifie que vous pouvez également remplacer ces "valeurs" avec code comme

#define X sqrt(Y)

ou même

#define X Y
4
James Snell

La réponse courte est C a besoin de types en raison de l'histoire/représentant le matériel.

Histoire: C a été développé au début des années 1970 et prévu comme une langue pour la programmation des systèmes. Le code est idéalement rapide et permet d'utiliser au mieux les capacités du matériel.

Les types infernes au moment de la compilation auraient été possibles, mais les temps de compilation déjà lents auraient augmenté (voir "Compilation de la" compilation "de XKCD. Celui-ci s'appliquait à" Hello World "pendant au moins 10 ans après la publication de C ). Les types infernes au moment de l'exécution n'auraient pas été adaptés aux objectifs de la programmation des systèmes. Runtime Inferrence nécessite une bibliothèque de temps d'exécution supplémentaire. C est arrivé longtemps avant le premier PC. Qui avait 256 bélier. Pas gigaoctets ou mégaoctets mais kilo-octets.

Dans votre exemple, si vous omettez les types

   X=5.2;
   Y=5.1;

   Z=Y+X;

Ensuite, le compilateur aurait pu heureusement élaborer que X & Y sont des flotteurs et rendu Z de la même manière. En fait, un compilateur moderne entraînerait également que X & Y ne soit pas nécessaire et il suffit de définir Z à 10.3.

Supposons que le calcul est incorporé à l'intérieur d'une fonction. Le rédacteur de la fonction voudra peut-être utiliser leurs connaissances sur le matériel ou le problème résolu.

Un double sera-t-il plus approprié qu'un flotteur? Prend plus de mémoire et est plus lent, mais la précision du résultat serait plus élevée.

Peut-être que la valeur de retour de la fonction pourrait être int (ou longue) car les décimales n'étaient pas importantes, bien que la conversion du flotteur vers INT n'est pas sans coût.

La valeur de retour pourrait également être faite double garantissant que le flotteur + float ne déborde pas.

Toutes ces questions semblent inutiles pour la grande majorité du code écrit aujourd'hui, mais étaient essentiels lorsque C a été produit.

1
itj

C n'a pas d'inférence de type (c'est ce qu'on appelle quand un compilateur devine le type d'une variable pour vous) car il est vieux. Il a été développé dans le début des années 197

De nombreuses langues plus récentes ont des systèmes qui vous permettent d'utiliser des variables sans spécifier leur type (rubis, javascript, python, etc.)

0
Tristan Burnside