Por que é “a”! = “A” em C?

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

Por que a saída No, not equal ?

O que você está comparando são os dois endereços de memory para as diferentes strings, que são armazenadas em locais diferentes. Fazer isso essencialmente se parece com isso:

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

Use o código a seguir para comparar dois valores de string:

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

Além disso, "a" == "a" pode de fato retornar true, dependendo do seu compilador, que pode combinar strings iguais em tempo de compilation em uma para economizar espaço.

Quando você está comparando valores de dois caracteres (que não são pointers), é uma comparação numérica. Por exemplo:

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

Estou um pouco atrasado para a festa, mas vou responder de qualquer maneira; tecnicamente os mesmos bits, mas de uma perspectiva um pouco diferente (linguagem C abaixo):

Em C, a expressão "a" denota uma string literal , que é uma matriz estática sem nome de const char , com um comprimento de dois – a matriz consiste em caracteres 'a' e '\0' – o caractere nulo de terminação sinaliza o fim da corda.

No entanto, em C, da mesma forma que você não pode passar matrizes para funções por valor – ou atribuir valores a elas ( após a boot ) – não há operador sobrecarregado == para matrizes, portanto não é possível compará-las diretamente. 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 

Se o == não está comparando matrizes, o que ele realmente faz, então? Em C, em quase todos os contextos – incluindo este – os arrays decaem em pointers (que apontam para o primeiro elemento do array) – e comparar pointers para igualdade faz o que você espera. Então, efetivamente, ao fazer isso

 "a" == "a" 

Na verdade, você está comparando os endereços dos primeiros caracteres em dois arrays sem nome . De acordo com o padrão C, a comparação pode resultar em verdadeiro ou falso (ou seja, 1 ou 0) – "a" s pode realmente denotar o mesmo array ou dois arrays completamente não relacionados. Em termos técnicos, o valor resultante não é especificado , o que significa que a comparação é permitida (ou seja, comportamento não indefinido ou um erro de syntax), mas o valor é válido e a implementação (seu compilador) não é necessária para documentar o que realmente acontecerá.

Como outros apontaram, para comparar “strings c” (ou seja, strings terminadas com um caractere nulo) você usa a function de conveniência strcmp encontrada no arquivo de header padrão string.h . A function tem um valor de retorno de 0 para cadeias iguais; é considerado uma boa prática comparar explicitamente o valor de retorno a 0 vez de usar o operador `! ´, ou seja,

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

De acordo com C99 (Seção 6.4.5 / 6)

Literais de cordas

Não é especificado se essas matrizes são distintas, desde que seus elementos tenham os valores apropriados .

Portanto, neste caso, não é especificado se ambos os "a" são distintos. Um compilador otimizado poderia manter um único "a" no local somente leitura e ambas as referências poderiam se referir a isso.

Confira a saída no gcc aqui

Porque eles são 2 const char* ‘s separados, pointers, sem valores reais. Você está dizendo algo como 0x019181217 == 0x0089178216 que naturalmente não retorna

Use strcmp() vez de ==

Simplificando, C não possui um operador de comparação de strings embutido. Não é possível comparar cadeias dessa maneira.

Em vez disso, as cadeias de caracteres são comparadas usando rotinas de biblioteca padrão, como strcmp () ou gravando código para percorrer cada caractere na cadeia.

Em C, uma string de texto entre aspas duplas retorna um ponteiro para a string. Seu exemplo é comparar os pointers e, aparentemente, suas duas versões da string existem em endereços diferentes.

Mas não é comparar as cordas em si, como você parece esperar.

Ponteiros

O primeiro "a" é um ponteiro para uma cadeia ASCII com terminação nula.

O segundo "a" é um ponteiro para outra cadeia ASCII terminada por caractere nulo.

Se você estiver usando um compilador de 32 bits, esperaria "a"=="a"-4 . Eu apenas tentei com o tcc / Win32 e recebo "a"=="a"-2 . Ah bem…

Você está comparando dois endereços de memory, então o resultado nem sempre será verdadeiro. Você tentou if('a' == 'a'){...} ?

Alguns compiladores têm a opção ‘mesclar strings’ que você pode usar para forçar todas as strings constantes a terem o mesmo endereço. Se você usasse isso, "a" == "a" seria true .

esta questão define muito boa trilha de explicação para todos os iniciantes ….
deixe-me também contribuir para isso …..

como todo mundo acima explicou, por que você está recebendo essa saída.

Agora, se você quiser seu prog. Para imprimir “sim igual”, então

quer usar

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

ou
não use “a” como strings, use-os como caracteres ….

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

em caracteres C são inteiros curtos de 1 byte …….

se a comparação entre os caracteres estiver sempre em aspas simples, por exemplo

 if('a' == 'a') 

e C não pode suportar comparação de strings como "abc" == "abc"

É feito com strcmp("abc","abc")

Esse cara não usa variables. Em vez disso, ele usa temporariamente matrizes de texto: a e a . A razão porque

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

não funciona, é claro, é que você não compara variables.
Se você criaria variables ​​como:

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

então você pode comparar text com text2 , e isso deve ser verdade

Talvez você não deva esquecer de usar { e } =)

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