Comprendre les types de données, la conversion et les structures C

10

C est strict sur ce qu’il garde en mémoire. Cela ne devine pas. Vous devez lui dire exactement quel type de données vous stockez. Ce n’est pas seulement du pédantisme. Cela affecte la façon dont votre programme s’exécute, la quantité de mémoire qu’il utilise et si vos calculs sont corrects ou erronés.

Les types de variables standard

Il existe trois types de variables standard en C.

Entier : int
Il s’agit d’un entier de 4 octets. Il gère les nombres entiers.

Point flottant : float
Il s’agit d’une valeur à virgule flottante de 4 octets. Il gère les décimales.

Caractère : char
Il s’agit d’un caractère unique de 1 octet. Pensez « a » ou « 3 ». Une chaîne en C n’est qu’un tableau de ces caractères.

Ensuite, il existe des types dérivés. Vous les utilisez lorsque les trois standards ne suffisent pas.

  • double  : Une valeur à virgule flottante de 8 octets. Plus de précision.
  • short  : Un entier de 2 octets. Moins de mémoire, moins de portée.
  • unsigned short ou unsigned int  : ceux-ci gèrent uniquement les entiers positifs. Aucun signe. Si vous avez besoin de suivre le nombre de populations ou la taille des paquets, c’est souvent le bon choix.

Opérateurs et priorité des opérateurs

Les opérateurs en C semblent familiers.

  • Ajout de +
  • Soustraction -
  • Division /
  • * multiplication
    *Module %

Mais attention à la division. L’opérateur / effectue une division entière si les deux opérandes sont des entiers. Sinon, il effectue une division en virgule flottante.

Regardez ce code :

Il imprime une valeur à virgule flottante car « a » est déclaré comme type « float ». Mais « a » sera 3.0. Pourquoi? Parce que le code a d’abord effectué une division entière. 10 divisé par 3 donne 3. Le résultat est 3. Ensuite, ce 3 est converti en 3,0 lorsqu’il est stocké dans « a ». La précision a été perdue avant même d’atteindre la variable.

La priorité des opérateurs en C suit les règles standard. La division et la multiplication ont lieu avant l’addition et la soustraction.

Le résultat de « 5+3*4 » est 17. Pas 32. L’opérateur « * » a une priorité plus élevée que « + ». Vous pouvez remplacer cela par des parenthèses. (5+3)*4 vaut 32. Le 5+3 est évalué en premier.

La priorité devient compliquée plus tard. Une fois que les pointeurs entrent dans le chat, cela devient compliqué. Mais pour l’instant, n’oubliez pas : multipliez et divisez avant d’ajouter et de soustraire.

Typage

C vous permet de convertir des types à la volée. Vous faites cela souvent avec des pointeurs. Cela se produit également automatiquement lors de l’affectation pour certains types.

Dans l’exemple ci-dessus, le résultat entier « 10/3 » a été automatiquement converti en flottant. Mais et si vous vouliez la décimale ?

Vous effectuez un transtypage en plaçant le nom du type entre parenthèses avant la valeur.

Remplacez a=10/3; par a=(float)10/3;.

Maintenant, « a » vaut 3,33333. Le 10 est converti en valeur à virgule flottante avant la division. La division se produit en virgule flottante. Le résultat conserve ses décimales.

Typedef

Vous pouvez déclarer des types nommés et définis par l’utilisateur en C avec l’instruction typedef. Ceci est courant dans le code C.

Cela vous permet de déclarer des types booléens. C n’a pas de type bool natif dans les anciennes normes, il s’agit donc d’une solution de contournement.

Si vous n’aimez pas le mot « flotter », vous pouvez dire :

Puis plus tard :

Placez les instructions typedef n’importe où dans le programme. Assurez-vous simplement qu’ils arrivent avant leur première utilisation.

Structures

Les structures en C regroupent les variables dans un package.

Chaque fois que vous souhaitez déclarer des structures de type « rec », vous devez dire « struct rec ». C’est facile à oublier. Vous obtiendrez des erreurs du compilateur si vous omettez la « struct ».

Vous pouvez compresser le code :

Ici, la déclaration de type et la variable « r » sont déclarées dans la même instruction.

Ou utilisez typedef pour le nom de la structure. Si vous détestez taper « struct rec r » à chaque fois :

Déclarez ensuite les enregistrements en disant :

Accédez aux champs en utilisant un point. r.a = 5;.

Tableaux

Vous déclarez des tableaux en insérant une taille après la déclaration normale.

Les tableaux sont des blocs de mémoire contigus. Accéder à un index en dehors des limites est un comportement indéfini. Cela pourrait planter. Cela pourrait corrompre les données. Cela peut sembler fonctionner jusqu’à ce que ce ne soit plus le cas.

Incrémentation

C a des raccourcis pour les opérations courantes.

  • i = i + 1; devient i++;
  • i = i - 1; devient i--;
  • i = i + 3; devient i += 3;
  • i = i * j; devient i *= j;

Ce ne sont pas seulement du sucre syntaxique. Ils compilent souvent vers un code machine plus efficace. Utilisez-les.

Erreurs C à éviter

L’opérateur / avec deux entiers est un piège. Cela tronque la partie décimale. Vérifiez toujours vos types avant de diviser. Si vous avez besoin de précision, convertissez d’abord un opérande en « float » ou « double ».

Pensez-y chaque fois que vous l’utilisez. Sinon, vos chiffres seront faux. Et le débogage des problèmes de division entière est pénible.

Essayez ceci

  • Expérimentez avec le transtypage. Essayez int, char, float. Voyez ce qui se passe lorsque vous les mélangez.
  • Créez un tableau d’enregistrements. Écrivez du code pour trier ce tableau sur un champ entier. Il vous apprend les pointeurs, la disposition de la mémoire et le flux de contrôle.

Les détails comptent en C. Si vous manquez un type, tout le programme s’interrompt. Faites les choses correctement, et ça court vite.