¿Por qué es “a”! = “A” en C?

void main() { if("a" == "a") printf("Yes, equal"); else printf("No, not equal"); } 

¿Por qué la salida No, not equal ?

Lo que está comparando son las dos direcciones de memoria para las diferentes cadenas, que se almacenan en diferentes ubicaciones. Al hacerlo, esencialmente se ve así:

 if(0x00403064 == 0x002D316A) // Two memory locations { printf("Yes, equal"); } 

Use el siguiente código para comparar dos valores de cadena:

 #include  ... if(strcmp("a", "a") == 0) { // Equal } 

Además, "a" == "a" puede devolver cierto, dependiendo de su comstackdor, que puede combinar cadenas iguales en tiempo de comstackción en una para ahorrar espacio.

Cuando compara dos valores de caracteres (que no son punteros), se trata de una comparación numérica. Por ejemplo:

 'a' == 'a' // always true 

Llego un poco tarde a la fiesta, pero responderé de todos modos; técnicamente los mismos bits, pero desde una perspectiva un poco diferente (lenguaje C a continuación):

En C, la expresión "a" denota un literal de cadena , que es una matriz estática sin nombre de const char , con una longitud de dos: la matriz consta de los caracteres 'a' y '\0' – el carácter nulo de terminación señala el final de la cuerda.

Sin embargo, en C, de la misma forma que no puede pasar matrices a funciones por valor, o asignarles valores ( después de la inicialización ), no hay operador sobrecargado == para matrices, por lo que no es posible compararlas directamente. Considerar

 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 el == no está comparando matrices, ¿qué es lo que realmente hace, entonces? En C, en casi todos los contextos, incluido este, las matrices decaen en punteros (que apuntan al primer elemento de la matriz) y la comparación de punteros para la igualdad hace lo que cabría esperar. De manera efectiva, al hacer esto

 "a" == "a" 

en realidad está comparando las direcciones de los primeros caracteres en dos matrices sin nombre . De acuerdo con el estándar C, la comparación puede dar como verdadero o falso (es decir, 1 o 0) – "a" s en realidad puede denotar la misma matriz o dos matrices completamente no relacionadas. En términos técnicos, el valor resultante no está especificado , lo que significa que la comparación está permitida (es decir, no es un comportamiento indefinido o un error de syntax), pero el valor es válido y la implementación (su comstackdor) no es necesaria para documentar lo que realmente sucederá.

Como han señalado otros, para comparar “cadenas de caracteres c” (es decir, cadenas terminadas con un carácter nulo) se usa la función de conveniencia strcmp encuentra en el archivo de encabezado estándar string.h . La función tiene un valor de retorno de 0 para cadenas iguales; se considera buena práctica comparar explícitamente el valor de retorno a 0 lugar de usar el operador `! ‘, es decir,

 strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2) 

De acuerdo en C99 (Sección 6.4.5 / 6)

Literales de cuerda

No se especifica si estas matrices son distintas siempre que sus elementos tengan los valores adecuados .

Entonces en este caso no se especifica si ambas "a" son distintas. Un comstackdor optimizado podría mantener una única "a" en la ubicación de solo lectura y ambas referencias podrían referirse a eso.

Vea la salida en gcc aquí

Debido a que son 2 const char* ‘s, punteros separados, no hay valores reales. Usted dice algo como 0x019181217 == 0x0089178216 que, por supuesto, devuelve NO

Use strcmp() lugar de ==

En pocas palabras, C no tiene un operador de comparación de cadenas incorporado. No puede comparar cadenas de esta manera.

En cambio, las cadenas se comparan utilizando rutinas de biblioteca estándar como strcmp () o escribiendo código para recorrer cada carácter de la cadena.

En C, una cadena de texto entre comillas dobles devuelve un puntero a la cadena. Su ejemplo es comparar los punteros, y aparentemente sus dos versiones de la cadena existen en diferentes direcciones.

Pero no está comparando los hilos en sí, como parece esperar.

Punteros.

La primera "a" es un puntero a una cadena ASCII terminada en nulo.

La segunda "a" es un puntero a otra cadena ASCII terminada en nulo.

Si está utilizando un comstackdor de 32 bits, esperaría "a"=="a"-4 . Sin embargo, lo probé con tcc / Win32 y obtengo "a"=="a"-2 . Oh bien…

Está comparando dos direcciones de memoria, por lo que el resultado no siempre será cierto. ¿Has intentado if('a' == 'a'){...} ?

Algunos comstackdores tienen la opción ‘combinar cadenas’ que puede usar para forzar a todas las cadenas constantes a tener la misma dirección. Si usa eso, "a" == "a" sería true .

esta pregunta establece un buen rastro de explicación para todos los principiantes …
déjame también contribuir a eso …..

como todos explicaron anteriormente, ¿por qué obtiene ese resultado?

ahora si quieres tu prog. Para imprimir “sí igual”, entonces

ya sea uso

 if(strcmp("a", "a") == 0) { } 

o
no use “a” como cadenas, úselas como caracteres …

 if('a'=='a') { printf ("yes Equal"); } 

en C los caracteres son un entero corto de 1 byte …….

si la comparación entre caracteres está siempre en comillas simples, por ejemplo

 if('a' == 'a') 

y C no puede soportar la comparación de cadenas como "abc" == "abc"

Está hecho con strcmp("abc","abc")

Este chico no usa variables. En cambio, utiliza matrices de texto temporalmente: a y a . La razón por la cual

 void main() { if("a" == "a") printf("Yes, equal"); else printf("No, not equal"); } 

no funciona, por supuesto, es que no se comparan las variables.
Si creara variables como:

char * text = “a”;
char * text2 = “a”;

entonces podrías comparar text con text2 , y debería ser cierto

Tal vez no deberías olvidarte de usar { and } =)

 void main() { if("a" == "a") { printf("Yes, equal"); } else { printf("No, not equal"); } }