Comment c compare-t-il la variable de caractère à la chaîne?

Le code suivant est complètement correct en C mais pas en C ++. Dans le code suivant, if déclaration est toujours fausse. Comment C compare la variable de caractère à la chaîne?

 int main() { char ch='a'; if(ch=="a") printf("confusion"); return 0; } 

Le code suivant est complètement ok en C

Non pas du tout.

Dans votre code

  if(ch=="a") 

essaie essentiellement de comparer la valeur de ch avec l’adresse de base du littéral de chaîne "a" ,. C’est sens-et-utiliser-moins.

Ce que vous voulez ici, c’est d’utiliser des guillemets simples ( ' ) pour désigner un caractère littéral, comme

  if(ch == 'a') 

NOTE 1:

Pour préciser la différence entre les guillemets simples pour les littéraux de caractères et les doubles guillemets pour les littéraux de chaînes ,

Pour le caractère littéral, C11 , chapitre §6.4.4.4

Une constante de caractère entier est une séquence d’un ou plusieurs caractères multi-octets entre guillemets simples, comme dans 'x'

et, pour le littéral de chaîne , chapitre §6.4.5

Un littéral de chaîne de caractères est une séquence de zéro ou plusieurs caractères multi-octets entre guillemets, comme dans "xyz" .


NOTE 2:

Cela dit, la signature recommandée de main() est int main(void) .

Il y a une différence entre 'a' (un caractère) et "a" (une chaîne de deux caractères a et \0 ). ch=="a" comparaison sera évaluée à false car dans cette expression "a" sera converti en pointeur sur son premier élément et bien sûr cette adresse n’est pas un caractère mais un nombre hexadécimal.

Le changer en

  if(ch=='a') 

Je ne dirais pas que le code convient dans l’une ou l’autre langue.

'a' est un caractère unique. Il s’agit en fait d’un petit nombre entier ayant pour valeur la valeur du caractère donné dans le jeu de caractères de la machine (presque invariablement ASCII). Donc 'a' a la valeur 97, comme vous pouvez le constater en lançant

 char c = 'a'; printf("%d\n", c); 

"a" , en revanche, est une chaîne. C’est un tableau de caractères, terminé par un caractère nul. En C, les pointeurs désignent presque toujours les tableaux par leur premier élément. Ainsi, dans ce cas, la constante de chaîne "a" comporte comme un pointeur sur un tableau de deux caractères, 'a' et le caractère final '\0' . Vous pouvez voir cela en exécutant

 char *str = "a"; printf("%d %d\n", str[0], str[1]); 

Cela va imprimer

 97 0 

Maintenant, nous ne soaps pas où le compilateur choisira de mettre notre chaîne en mémoire, nous ne soaps donc pas quelle sera la valeur du pointeur, mais il est prudent de dire qu’il ne sera jamais égal à 97. Le la comparaison if(ch=="a") sera toujours fausse.

Lorsque vous devez comparer un caractère et une chaîne, vous avez deux choix. Vous pouvez comparer le caractère au premier caractère de la chaîne:

 if(c == str[0]) printf("they are equal\n"); else printf("confusion\n"); 

Ou vous pouvez construire une chaîne à partir du caractère et comparer cela. En C, cela pourrait ressembler à ceci:

 char tmpstr[2]; tmpstr[0] = c; tmpstr[1] = '\0'; if(strcmp(tmpstr, str) == 0) printf("they are equal\n"); else printf("confusion\n"); 

C’est la solution pour C. Il existe un type de chaîne différent, plus puissant, en C ++, donc les choses seraient différentes dans ce langage.