void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Pourquoi la sortie No, not equal
?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Pourquoi la sortie No, not equal
?
Ce que vous comparez les deux adresses de mémoire pour les différentes chaînes, qui sont stockés dans des emplacements différents. Ce faisant essentiellement ressemble à ceci:
if(0x00403064 == 0x002D316A) // Two memory locations
{
printf("Yes, equal");
}
Utilisez le code suivant pour comparer deux valeurs de chaîne:
#include <string.h>
...
if(strcmp("a", "a") == 0)
{
// Equal
}
En outre, "a" == "a"
peut en effet renvoyer la valeur true, selon votre compilateur, qui peut combiner l'égalité des cordes au moment de la compilation en un seul pour économiser de l'espace.
Lorsque vous êtes à la comparaison de deux valeurs de type caractère (qui ne sont pas des pointeurs), c'est une comparaison numérique. Par exemple:
'a' == 'a' // always true
Je suis un peu en retard à la fête, mais je vais répondre quand même; techniquement les mêmes bits, mais à partir d'un peu différent de la perspective (langage C ci-dessous):
En C, l'expression "a"
désigne une chaîne de caractères littérale, qui est statique, sans nom de tableau de const char
, avec une longueur de deux - le tableau est constitué de caractères 'a'
et '\0'
- le caractère de fin null signaux de la fin de la chaîne.
Toutefois, dans C, de la même façon vous ne pouvez pas vous passer des tableaux de fonctions par valeur ou de leur affecter des valeurs (après initialisation) - il n'y a pas d'opérateur surchargé ==
pour les tableaux, il n'est donc pas possible de les comparer directement. Envisager
int a1[] = {1, 2, 3};
int a2[] = {3, 4, 5};
a1 == a2 // is this meaningful? Yes and no; it *does* compare the arrays for
// "identity", but not for their values. In this case the result
// is always false, because the arrays (a1 and a2) are distinct objects
Si l' ==
n'est pas en comparant les tableaux, que faut-il réellement faire, alors? En C, dans presque tous les contextes, y compris celui - matrices de décomposition dans les pointeurs (qui pointent vers le premier élément du tableau) et la comparaison de pointeurs pour l'égalité est-ce que vous attendez. Donc, effectivement, quand on fait ce
"a" == "a"
vous êtes en fait en comparant les adresses des premiers caractères dans les deux tableaux sans nom. Selon la norme, la comparaison peut donner la valeur true ou false (c'est à dire 1 ou 0) - "a"
s peut effectivement désigner le même tableau ou deux complètement différents tableaux. En termes techniques, la valeur est indéterminée, ce qui signifie que la comparaison est autorisé (c'est à dire qu'il n'est pas un comportement indéfini ou une erreur de syntaxe), mais la valeur est valide et la mise en œuvre (le compilateur) n'est pas requis de documenter ce qui se passera réellement.
Comme d'autres l'ont souligné, à comparer les "chaînes c" (c'est à dire chaînes de caractères terminée par un caractère nul) vous utilisez la fonction de commodité strcmp
trouvées dans la norme en-tête du fichier string.h
. La fonction a une valeur de retour d' 0
pour l'égalité des chaînes de caractères; il est considéré comme une bonne pratique explicitement comparer la valeur de retour d' 0
, au lieu de l'aide de l'opérateur `!, c'est à dire
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)
Selon en C99(Section 6.4.5/6)
Les Littéraux De Chaîne
Il n'est pas précisé si ces tableaux sont distinctes, à condition que leur éléments ont les valeurs appropriées.
Dans ce cas, il n'est pas précisé si les deux "a"
s sont distincts. Une optimisation du compilateur pourrait tenir une unique, "a"
dans l'emplacement en lecture seule et les deux références pourrait y référer.
Découvrez la sortie sur gcc ici
Tout simplement, C est pas intégré dans la chaîne de l'opérateur de comparaison. Il ne peut pas comparer des chaînes de cette façon.
Au lieu de cela, les chaînes sont comparées en utilisant le standard de la bibliothèque de routines telles que strcmp() ou par l'écriture de code d'une boucle sur chaque caractère dans la chaîne.
En C, une chaîne de texte en double guillemets renvoie un pointeur vers la chaîne. Votre exemple est de comparer les pointeurs, qui, apparemment, ne correspondent pas à votre installation. Mais il n'est pas de comparer les chaînes elles-mêmes.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.