Perché “a”! = “A” in C?

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

Perché il numero di uscita No, not equal ?

Quello che stai confrontando sono i due indirizzi di memoria per le diverse stringhe, che sono memorizzati in posizioni diverse. Fare così essenzialmente si presenta così:

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

Utilizzare il codice seguente per confrontare due valori stringa:

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

Inoltre, "a" == "a" può effettivamente restituire true, a seconda del compilatore, che può combinare stringhe uguali in fase di compilazione in uno per risparmiare spazio.

Quando si confrontano due valori di carattere (che non sono puntatori), si tratta di un confronto numerico. Per esempio:

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

Sono un po ‘in ritardo per la festa, ma risponderò comunque; tecnicamente gli stessi bit, ma da una prospettiva leggermente diversa (in gergo C di seguito):

In C, l’espressione "a" denota una stringa letterale , che è una matrice non definita statica di const char , con una lunghezza di due – l’array è costituito da caratteri 'a' e '\0' – il carattere null terminante segnala la fine della stringa.

Tuttavia, in C, allo stesso modo non è ansible passare gli array alle funzioni in base al valore o assegnare loro valori ( dopo l’inizializzazione ) – non esiste un operatore sovraccarico == per gli array, quindi non è ansible confrontarli direttamente. Prendere in considerazione

 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 il == non sta confrontando gli array, cosa fa in realtà, allora? In C, in quasi tutti i contesti – incluso questo – gli array decadono in puntatori (che puntano al primo elemento dell’array) – e confrontare i puntatori per l’uguaglianza fa quello che ti aspetteresti. Così efficacemente, quando lo fai

 "a" == "a" 

in realtà stai confrontando gli indirizzi dei primi caratteri in due array senza nome . Secondo lo standard C, il confronto può produrre sia vero che falso (cioè 1 o 0) – "a" s può effettivamente denotare lo stesso array o due array completamente indipendenti. In termini tecnici, il valore risultante non è specificato , il che significa che il confronto è consentito (ovvero non è un comportamento indefinito o un errore di syntax), ma entrambi i valori sono validi e l’implementazione (il compilatore) non è necessaria per documentare cosa accadrà effettivamente.

Come altri hanno sottolineato, per confrontare “stringhe c” (cioè stringhe terminate con un carattere nullo) si utilizza la funzione comoda strcmp trovata nel file di intestazione standard string.h . La funzione ha un valore di ritorno pari a 0 per stringhe uguali; è considerata una buona pratica confrontare esplicitamente il valore di ritorno a 0 invece di usare l’operatore `! ‘, es

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

Secondo in C99 (Sezione 6.4.5 / 6)

String letterali

Non è specificato se questi array siano distinti purché i loro elementi abbiano i valori appropriati .

Quindi in questo caso non è specificato se entrambi i "a" sono distinti. Un compilatore ottimizzato potrebbe mantenere una singola "a" nella posizione di sola lettura ed entrambi i riferimenti potrebbero fare riferimento a ciò.

Controlla l’output su gcc qui

Perché sono 2 const char* separati const char* , puntatori, nessun valore effettivo. Stai dicendo qualcosa come 0x019181217 == 0x0089178216 che ovviamente restituisce NO

Usa strcmp() invece di ==

In poche parole, C non ha un operatore di confronto delle stringhe incorporato. Non può confrontare le stringhe in questo modo.

Invece, le stringhe vengono confrontate utilizzando le routine di libreria standard come strcmp () o scrivendo il codice per scorrere in loop ogni carattere nella stringa.

In C, una stringa di testo tra virgolette restituisce un puntatore alla stringa. Il tuo esempio sta confrontando i puntatori e apparentemente le tue due versioni della stringa esistono in indirizzi diversi.

Ma non sta confrontando le stringhe stesse, come sembri aspettarti.

Puntatori.

Il primo "a" è un puntatore a una stringa ASCII con terminazione null.

Il secondo "a" è un puntatore a un’altra stringa ASCII con terminazione null.

Se stai usando un compilatore a 32 bit, mi aspetterei "a"=="a"-4 . L’ho appena provato con tcc / Win32, e ottengo "a"=="a"-2 . Oh bene…

Stai confrontando due indirizzi di memoria, quindi il risultato non sarà sempre vero. Hai provato if('a' == 'a'){...} ?

Alcuni compilatori hanno l’opzione ‘unisci stringhe’ che puoi usare per forzare tutte le stringhe costanti ad avere lo stesso indirizzo. Se lo usassi, "a" == "a" sarebbe true .

questa domanda pone un’ottima scia di spiegazione per tutti i principianti ….
lascia che anche io contribuisca ad esso …..

come tutti sopra hanno spiegato, perché ottieni questo risultato.

ora se vuoi il tuo prog Per stampare “sì uguale” allora

o usare

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

o
non usare “a” come stringhe, usale come caratteri ….

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

in C i caratteri sono interi a byte 1 byte …….

se la comparazione tra carattere è sempre in virgoletta singola, ad es

 if('a' == 'a') 

e C non supporta la comparazione delle stringhe come "abc" == "abc"

È fatto con strcmp("abc","abc")

Questo ragazzo non usa le variabili. Invece, usa temporaneamente matrici di testo: a e a . La ragione per cui

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

non funziona ovviamente, è che non si confrontano le variabili.
Se dovessi creare variabili come:

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

quindi potresti confrontare il text con text2 e dovrebbe essere vero

Forse non dovresti dimenticare di usare { e } =)

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