Condition

cs_damoun007 Messages postés 6 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 25 février 2003 - 25 févr. 2003 à 12:19
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003 - 26 févr. 2003 à 05:23
salut a tous,
j aurais voulu savoir la difference entre cela:
{
int a;
if (a=5);
....
}

et si on met le 5 entre apostrophes ou guillemets. Merci bcp

damoun

3 réponses

cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 8
25 févr. 2003 à 13:59
pour répondre à ta question
5 est un entier littéral considéré par le compilo comme unint qui vaut ... 5
'5' est un caractère isolé considéré par le compilo comme un char... et vaut ...53 (en décimal)
il faut regarder la table ANSI pour cela : '0' vaut 48
de plus, une condition ne s'exprime pas avec mais avec
ceci pour t'éviter des désagréments plus tard.
0
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
26 févr. 2003 à 04:17
> salut a tous,
> j aurais voulu savoir la difference entre cela:
> {
> int a;
> if (a=5);
> ....
> }
>
> et si on met le 5 entre apostrophes ou guillemets. Merci bcp

5 est un "littéral", un chiffre, une constante, un nombre (comme tu veux) de type int. 5.5 serait encore tout ça, mais de type float.

'5' est un caractère, un character, un char, une lettre (comme tu veux) de type char. À noter que le type char se comporte comme le int, c'est-à-dire que

char c = 65;

contient, sous un système ASCII' la lettre A et que

++c;

contient maintenant (roulement de tambour...) B.

"5" est une chaine de type c, une c-style string, une chaine de caractère, une string, une chaine de caractère terminée par un 0, par un \0, par un NUL, une zero-terminated string (comme tu veux) de type char*. Yurk, me diras-tu.

La différence entre 'a' et "a" est relativement simple. Si tu fais

char c = 'a';
char d = "a";

la deuxième ne devrait pas compiler. La raison vient de la façon dont les strings sont gérées par les compilateurs.

Une string n'est en fait qu'un rassemblement de chars sous forme de tableau :

char mastring[10];

Ici, on pourrait mettre jusqu'à 10 caractères dans ce tableau. Le problème et que si tu fais

std::cout << mastring;

'cout' n'a aucun moyen de savoir où se termine 'mastring'. Il est, en fait, impossible de connaitre directement le nombre d'élément de 'mastring'. 'cout' ne peut pas faire quelque chose comme

for (int i=0; i<sizeof(mastring); ++i)

parce que 'mastring' est en fait un pointeur. Mais tout ça n'est pas si grave.

Ce qu'il faut savoir, c'est que la solution à ce problème est une convention : les chaines de caractères doivent toujours se terminer par le caractère \0. En sachant cela, il est maintenant possible de faire

for (int i=0; ; i++)
{
if (mastring[i] = '\0')
break; //la chaine est terminée

// ....

}

Ce qui nous ramène aux guillemets qui ne sont finalement que pratiques : ils ajoutent automatiquement un \0 à la fin de la string. Donc,

"salut"

est en fait

salut\0

À quoi ça sert? Eh bien sans ça, tu serais obligé de faire :

char *mastring = "salut toi\0";

Ce qui est assez chiant et facile à manquer, te donnant des bugs à n'en plus finir, quasi impossibles à trouver. Les guillemets te l'ajoutent donc automatiquement :

char *mastring = "salut toi";

La morale est que : les apostrophes sont utilisés avec UN SEUL CARACTÈRE et ne rajoutent pas de \0 tandis que les guillemets sont utilisés avec les STRINGS et terminent celles-ci par un \0 automatiquement.
0
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
26 févr. 2003 à 05:23
> Une string n'est en fait qu'un rassemblement de chars
>sous forme de tableau :
>
> char mastring[10];
>
> Ici, on pourrait mettre jusqu'à 10 caractères dans ce
>tableau. Le problème et que si tu fais
>
> std::cout << mastring;
>
> 'cout' n'a aucun moyen de savoir où se termine 'mastring'.
>Il est, en fait, impossible de connaitre directement le
>nombre d'élément de 'mastring'. 'cout' ne peut pas faire
>quelque chose comme

Désolé, c'est plus ou moins de la connerie.

char mastring[10];
std::cout << sizeof(mastring);

affiche 10 comme prévu. Là où est le problème est lorsqu'on défini un pointeur vers un char auquel on assigne une string 'temporaire' :

char *mastring = "salut"

Ici, sizeof(mastring) retournera la grosseur du pointeur comme tel, pas de la chose sur laquelle il pointe (car, comme je disais, il n'y a aucun moyen de savoir combien d'éléments contient la string). La solution est donc d'ajouter une \0 à la fin de la string, qui permet de trouver sa fin.

Désolé,

Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware
0
Rejoignez-nous