void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Por que é a saída No, not equal
?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Por que é a saída No, not equal
?
Respostas:
O que você está comparando são os dois endereços de memória para as diferentes strings, que são armazenadas em locais diferentes. Isso basicamente se parece com isto:
if(0x00403064 == 0x002D316A) // Two memory locations
{
printf("Yes, equal");
}
Use o seguinte código para comparar dois valores de string:
#include <string.h>
...
if(strcmp("a", "a") == 0)
{
// Equal
}
Além disso, "a" == "a"
pode realmente retornar true, dependendo do seu compilador, que pode combinar strings iguais em tempo de compilação em uma para economizar espaço.
Quando você está comparando dois valores de caracteres (que não são ponteiros), é uma comparação numérica. Por exemplo:
'a' == 'a' // always true
-fmerge-constants
e -fno-merge-constants
para ativar / desativar corda e constante de ponto flutuante fusão entre as unidades de tradução, embora em alguns GCCs parece que fusão constante é sempre ativada, independentemente de essa opção.
int
tipo. :-) Além disso, os ponteiros não precisam ser valores numéricos.
int
também é numérico, não é? Mas eu pensei que chars fossem Byte. Int tem 4 bytes. Os ponteiros em si também são inteiros. Eles contêm o endereço de um monte de dados (dados que de fato não precisam ser numéricos).
'a' == 'A' // not true
... O MySQL discorda.
Estou um pouco atrasado para a festa, mas vou atender mesmo assim; tecnicamente os mesmos bits, mas de uma perspectiva um pouco diferente (linguagem C abaixo):
Em C, a expressão "a"
denota um literal de string , que é uma matriz estática não nomeada 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 string.
Porém, em C, da mesma forma que você não pode passar arrays para funções por valor - ou atribuir valores a eles ( após a inicialização ) - não há operador sobrecarregado ==
para arrays, então não é possível compará-los 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 estiver comparando matrizes, o que ele realmente fará? Em C, em quase todos os contextos - incluindo este - os arrays decaem em ponteiros (que apontam para o primeiro elemento do array) - e a comparação de ponteiros para igualdade faz o que você esperaria. Tão eficazmente, ao fazer isso
"a" == "a"
na verdade, você está comparando os endereços dos primeiros caracteres em duas matrizes 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 na verdade 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, não é um comportamento indefinido ou um erro de sintaxe), mas qualquer um dos valores é 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 função de conveniência strcmp
encontrada no arquivo de cabeçalho padrão string.h
. A função tem um valor de retorno de 0
para strings iguais; é considerado uma boa prática comparar explicitamente o valor de retorno ao em 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 string
Não é especificado se essas matrizes são distintas, desde que seus elementos tenham os valores apropriados .
Portanto, neste caso, não é especificado se os dois "a"
s são distintos. Um compilador otimizado pode manter um único "a"
local somente leitura e ambas as referências podem se referir a ele.
Verifique a saída do gcc aqui
Porque são 2 const char*
ponteiros separados , sem valores reais. Você está dizendo algo como o 0x019181217 == 0x0089178216
que obviamente retorna NÃO
Use em strcmp()
vez de==
Simplificando, C não tem nenhum operador de comparação de string embutido. Ele não pode comparar strings dessa maneira.
Em vez disso, as strings são comparadas usando rotinas de biblioteca padrão, como strcmp () ou escrevendo código para percorrer cada caractere na string.
Em C, uma string de texto entre aspas duplas retorna um ponteiro para a string. Seu exemplo está comparando os ponteiros e, aparentemente, suas duas versões da string existem em endereços diferentes.
Mas não é comparar as próprias cordas, como você parece esperar.
Ponteiros.
O primeiro "a"
é um ponteiro para uma string ASCII terminada em nulo.
O segundo "a"
é um ponteiro para outra string ASCII terminada em nulo.
Se você estiver usando um compilador de 32 bits, eu esperaria "a"=="a"-4
. Acabei de experimentar com tcc / Win32, no entanto, e entendi "a"=="a"-2
. Ah bem...
strcmp
a execução de vários bytes de uma vez. Alguns compiladores fazem isso, outros não, alguns fazem isso apenas para strings maiores do que o mínimo ...
esta questão estabelece um caminho de explicação muito bom para todos os iniciantes ....
deixe-me também contribuir com isso .....
como todos explicaram acima, por que você está obtendo tal saída.
agora se você quiser seu prog. Para imprimir "sim igual" então
ou use
if(strcmp("a", "a") == 0)
{
}
ou
não use "a" como strings, use-os como caracteres ....
if('a'=='a')
{
printf ("yes Equal");
}
em C os caracteres são um inteiro curto de 1 byte .......
'a'
, na verdade, são inteiros.
Alguns compiladores têm a opção 'merge 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
.
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"
Acabou com strcmp("abc","abc")
Esse cara não usa variáveis. Em vez disso, ele usa matrizes de texto temporariamente: 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 variáveis.
Se você criar variáveis como:
char * text = "a";
char * text2 = "a";
então você pode comparar text
com text2
, e deve ser verdade
Talvez você não deva se esquecer de usar {
e }
=)
void main() {
if("a" == "a")
{
printf("Yes, equal");
}
else
{
printf("No, not equal");
}
}
void main
??? Ew ...