Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
rvalue_et_lvalue [2016/05/23 16:05] sylvie-c [Le type d'une variable] |
rvalue_et_lvalue [2019/02/08 05:29] (Version actuelle) anthonyholstein |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
^ [[ratio|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[enum_class|Chapitre suivant]] ^ | ^ [[ratio|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[enum_class|Chapitre suivant]] ^ | ||
+ | |||
+ | __ ajouter l'operateur comma et la declaration de plusieurs variables __ | ||
====== Utiliser la mémoire avec les variables ====== | ====== Utiliser la mémoire avec les variables ====== | ||
Ligne 124: | Ligne 126: | ||
==== Modifier la valeur d'une variable ==== | ==== Modifier la valeur d'une variable ==== | ||
- | L'intérêt d'une variable est que vous allez pouvoir la réutiliser dans des expressions. A chaque fois qu'une expression contenant une variable est évaluée, la variable est remplacée par sa valeur lors du calcul. | + | <note warning>**Regle fondamentale** |
+ | |||
+ | Il ne faut jamais modifier plusieurs fois une meme variable dans une ligne de code ! L'ordre d'evaluation n'est pas fixe et le comportement n'est pas definie. | ||
+ | |||
+ | Par exemple : | ||
+ | |||
+ | <code cpp> | ||
+ | std::cout << ++i << ++i << std::endl; | ||
+ | </code> | ||
+ | |||
+ | Ce code modifie deux fois la variable ''i'' dans la meme ligne, ce qui produit un comportement indetermine. | ||
+ | |||
+ | Note : la vraie regle est un peu plus compliquee, mais retenez cette version simple pour le moment. | ||
+ | </note> | ||
+ | |||
+ | L'intérêt d'une variable est que vous allez pouvoir la réutiliser dans des expressions. À chaque fois qu'une expression contenant une variable est évaluée, la variable est remplacée par sa valeur lors du calcul. | ||
<code cpp main.cpp> | <code cpp main.cpp> | ||
Ligne 249: | Ligne 266: | ||
<code cpp> | <code cpp> | ||
- | unsigned shot int const i { 12 }; | + | unsigned short int const i { 12 }; |
unsigned int j { 3456 }; | unsigned int j { 3456 }; | ||
std::vector<long int> const v { 1, 2, 3 }; | std::vector<long int> const v { 1, 2, 3 }; | ||
Ligne 350: | Ligne 367: | ||
Un message d'erreur "type 'double' cannot be narrowed to 'int'" ("le type 'double' ne peut pas être restreint en type 'int'") indique que la conversion de types peut produire une perte d'information, c'est a dire que le type ''double'' peut contenir des valeurs que le type ''int'' ne peut pas contenir. | Un message d'erreur "type 'double' cannot be narrowed to 'int'" ("le type 'double' ne peut pas être restreint en type 'int'") indique que la conversion de types peut produire une perte d'information, c'est a dire que le type ''double'' peut contenir des valeurs que le type ''int'' ne peut pas contenir. | ||
- | Une note permet d'aider le développeur a corriger ce problème : "insert an explicit cast to silence this issue" ("insérer une conversion explicite pour faire taire ce problème"). | + | Une note permet d'aider le développeur à corriger ce problème : "insert an explicit cast to silence this issue" ("insérer une conversion explicite pour faire taire ce problème"). |
Le message suivant est un avertissement : "implicit conversion (...) changes value from 1.2 to 1" ("la conversion implicite change la valeur 1.2 en 1"). Sans surprise, puisque les types ne sont pas directement convertibles sans perte potentielle d'information, les valeurs doivent être arrondies (dans ce cas "1.2" en "1"). | Le message suivant est un avertissement : "implicit conversion (...) changes value from 1.2 to 1" ("la conversion implicite change la valeur 1.2 en 1"). Sans surprise, puisque les types ne sont pas directement convertibles sans perte potentielle d'information, les valeurs doivent être arrondies (dans ce cas "1.2" en "1"). | ||
Ligne 375: | Ligne 392: | ||
En fait, pour des raisons historiques, le type ''char'', qui représente un caractère, est considéré comme un type entier et peut donc être converti automatiquement par le compilateur (conversion implicite). La valeur 49 correspond au caractère ''1'' dans la norme [[https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange|ASCII]]. | En fait, pour des raisons historiques, le type ''char'', qui représente un caractère, est considéré comme un type entier et peut donc être converti automatiquement par le compilateur (conversion implicite). La valeur 49 correspond au caractère ''1'' dans la norme [[https://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange|ASCII]]. | ||
- | Généralement, la conversion de ''char'' en ''int'' ne posera pas de problème, mais dans d'autres cas, ce type de conversion implicite peut réellement produire des comportements non prévus par le développeur et être assez difficile a identifier et corriger. | + | Généralement, la conversion de ''char'' en ''int'' ne posera pas de problème, mais dans d'autres cas, ce type de conversion implicite peut réellement produire des comportements non prévus par le développeur et être assez difficile à identifier et corriger. |
**Conversion impossible** | **Conversion impossible** | ||
Ligne 555: | Ligne 572: | ||
Une autre notion importante concernant les objets, c'est la durée de vie. Celle-ci est simplement le temps entre le moment où un objet est crée en mémoire et le moment où cet objet est libérée. Essayez d'utiliser un objet qui n'est pas disponible en mémoire va provoquer au mieux un crash du programme, voire pire. Dans tous les cas, cela sera un comportement indéfini (//Undefined Behavior//). | Une autre notion importante concernant les objets, c'est la durée de vie. Celle-ci est simplement le temps entre le moment où un objet est crée en mémoire et le moment où cet objet est libérée. Essayez d'utiliser un objet qui n'est pas disponible en mémoire va provoquer au mieux un crash du programme, voire pire. Dans tous les cas, cela sera un comportement indéfini (//Undefined Behavior//). | ||
- | Il existe plusieurs types de variables (dynamique, statique, etc), mais pour le moment, vous n'avez vu que les variables locales, dans ce chapitre. Dans cette situation, la durée de vie peut être confondue avec la portée (ce n;'est pas tout a fait vrai, mais vous verrez cela plus tard, dans le chapitre sur la Pile) : | + | Il existe plusieurs types de variables (dynamique, statique, etc), mais pour le moment, vous n'avez vu que les variables locales, dans ce chapitre. Dans cette situation, la durée de vie peut être confondue avec la portée (ce n'est pas tout a fait vrai, mais vous verrez cela plus tard, dans le chapitre sur la Pile) : |
**Un objet est crée en mémoire lorsqu'une variable locale est déclarée dans le code et il est détruit lorsque la variable sort de sa portée.** | **Un objet est crée en mémoire lorsqu'une variable locale est déclarée dans le code et il est détruit lorsque la variable sort de sa portée.** |