void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Warum ist die Ausgabe No, not equal
?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
Warum ist die Ausgabe No, not equal
?
Antworten:
Was Sie vergleichen, sind die beiden Speicheradressen für die verschiedenen Zeichenfolgen, die an verschiedenen Orten gespeichert sind. Dies sieht im Wesentlichen so aus:
if(0x00403064 == 0x002D316A) // Two memory locations
{
printf("Yes, equal");
}
Verwenden Sie den folgenden Code, um zwei Zeichenfolgenwerte zu vergleichen:
#include <string.h>
...
if(strcmp("a", "a") == 0)
{
// Equal
}
"a" == "a"
Abhängig von Ihrem Compiler, der zur Kompilierungszeit gleiche Zeichenfolgen zu einer kombinieren kann , kann dies tatsächlich true zurückgeben, um Platz zu sparen.
Wenn Sie zwei Zeichenwerte (die keine Zeiger sind) vergleichen, handelt es sich um einen numerischen Vergleich. Beispielsweise:
'a' == 'a' // always true
-fmerge-constants
und -fno-merge-constants
aktivieren / deaktivieren String und Floating-Point - Konstante über Übersetzungseinheiten verschmelzen, obwohl auf einigen GCCs scheint es , dass konstante Verschmelzung immer aktiviert , unabhängig von dieser Option.
int
Typ. :-) Außerdem müssen Zeiger keine numerischen Werte sein.
int
ist auch numerisch, nicht wahr? Aber ich dachte, Zeichen wären Byte. Int ist 4 Bytes. Die Zeiger selbst sind ebenfalls ganzzahlig. Sie enthalten die Adresse einer Reihe von Daten (Daten, die tatsächlich nicht numerisch sein müssen).
'a' == 'A' // not true
... MySQL unterscheidet sich.
Ich bin etwas spät zur Party, aber ich werde trotzdem antworten. technisch die gleichen Bits, aber aus einer etwas anderen Perspektive (C-Sprache unten):
In C bezeichnet der Ausdruck "a"
ein Zeichenfolgenliteral , bei dem es sich um ein statisches unbenanntes Array const char
mit einer Länge von zwei handelt. Das Array besteht aus Zeichen, 'a'
und '\0'
das abschließende Nullzeichen signalisiert das Ende der Zeichenfolge.
In C gibt es jedoch auf die gleiche Weise, wie Sie Arrays nicht nach Wert an Funktionen übergeben oder ihnen Werte zuweisen können ( nach der Initialisierung ), keinen überladenen Operator ==
für Arrays, sodass es nicht möglich ist, sie direkt zu vergleichen. Erwägen
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
Wenn das ==
Arrays nicht vergleicht, was macht es dann tatsächlich? In C zerfallen Arrays in fast allen Kontexten - einschließlich dieses - in Zeiger (die auf das erste Element des Arrays zeigen) - und der Vergleich von Zeigern auf Gleichheit bewirkt, was Sie erwarten. So effektiv, wenn Sie das tun
"a" == "a"
Sie vergleichen tatsächlich die Adressen der ersten Zeichen in zwei unbenannten Arrays . Gemäß dem C-Standard kann der Vergleich entweder wahr oder falsch ergeben (dh 1 oder 0) - "a"
s können tatsächlich dasselbe Array oder zwei völlig unabhängige Arrays bezeichnen. In technischer Hinsicht ist der resultierende Wert nicht angegeben , was bedeutet, dass der Vergleich zulässig ist (dh es ist kein undefiniertes Verhalten oder ein Syntaxfehler), aber jeder Wert ist gültig und die Implementierung (Ihr Compiler) ist nicht erforderlich, um zu dokumentieren, was tatsächlich passieren wird.
Wie andere bereits betont haben, verwenden Sie zum Vergleichen von "c-Zeichenfolgen" (dh Zeichenfolgen, die mit einem Nullzeichen abgeschlossen sind) strcmp
die in der Standard-Header-Datei enthaltene Komfortfunktion string.h
. Die Funktion hat einen Rückgabewert von 0
für gleiche Zeichenfolgen. Es wird als bewährte Methode angesehen, den Rückgabewert explizit mit zu vergleichen, 0
anstatt den Operator `! ´ zu verwenden, d. h
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)
Gemäß C99 (Abschnitt 6.4.5 / 6)
String-Literale
Es ist nicht spezifiziert, ob diese Arrays unterschiedlich sind, vorausgesetzt, ihre Elemente haben die entsprechenden Werte .
In diesem Fall ist also nicht spezifiziert, ob beide "a"
s verschieden sind. Ein optimierter Compiler könnte eine einzelne "a"
an der schreibgeschützten Stelle behalten, und beide Referenzen könnten darauf verweisen.
Überprüfen Sie die Ausgabe auf gcc hier
Da es sich um zwei separate const char*
Zeiger handelt, keine tatsächlichen Werte. Sie sagen so etwas wie das, 0x019181217 == 0x0089178216
was natürlich NEIN zurückgibt
Verwenden Sie strcmp()
anstelle von==
Einfach ausgedrückt hat C keinen eingebauten String-Vergleichsoperator. Auf diese Weise können Zeichenfolgen nicht verglichen werden.
Stattdessen werden Zeichenfolgen mithilfe von Standardbibliotheksroutinen wie strcmp () oder durch Schreiben von Code zum Durchlaufen jedes Zeichens in der Zeichenfolge verglichen.
In C gibt eine Textzeichenfolge in doppelten Anführungszeichen einen Zeiger auf die Zeichenfolge zurück. In Ihrem Beispiel werden die Zeiger verglichen, und anscheinend sind Ihre beiden Versionen der Zeichenfolge an unterschiedlichen Adressen vorhanden.
Aber es geht nicht darum, die Saiten selbst zu vergleichen, wie Sie zu erwarten scheinen.
Zeiger.
Der erste "a"
ist ein Zeiger auf eine nullterminierte ASCII-Zeichenfolge.
Der zweite "a"
ist ein Zeiger auf eine andere nullterminierte ASCII-Zeichenfolge.
Wenn Sie einen 32-Bit-Compiler verwenden, würde ich erwarten "a"=="a"-4
. Ich habe es gerade mit tcc / Win32 versucht, und ich verstehe "a"=="a"-2
. Naja...
strcmp
Ausführung mehrerer Bytes ermöglichen. Einige Compiler tun es, andere nicht, andere nur für Strings, die länger als ein Minimum sind ...
Diese Frage ist für alle Anfänger eine sehr gute Erklärung.
Lassen Sie mich auch dazu beitragen.
Wie alle oben erklärt haben, warum Sie eine solche Ausgabe erhalten.
Jetzt, wenn du deinen Prog willst. Dann "Ja gleich" drucken
entweder verwenden
if(strcmp("a", "a") == 0)
{
}
oder verwenden
Sie nicht "a" als Zeichenfolgen, verwenden Sie sie als Zeichen ....
if('a'=='a')
{
printf ("yes Equal");
}
in C Zeichen sind 1 Byte kurze Ganzzahl .......
'a'
sind tatsächlich Ganzzahlen.
Einige Compiler verfügen über die Option "Zeichenfolgen zusammenführen", mit der Sie erzwingen können, dass alle konstanten Zeichenfolgen dieselbe Adresse haben. Wenn Sie das nutzen "a" == "a"
würden , wäre true
.
wenn der Vergleich zwischen Zeichen immer in einfachen Anführungszeichen steht, z
if('a' == 'a')
und C kann den String-Vergleich nicht unterstützen "abc" == "abc"
Es ist erledigt mit strcmp("abc","abc")
Dieser Typ verwendet keine Variablen. Stattdessen verwendet er vorübergehend Textarrays: a
und a
. Der Grund warum
void main()
{
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
funktioniert natürlich nicht, ist, dass man keine variablen vergleicht.
Wenn Sie Variablen erstellen würden wie:
char * text = "a";
char * text2 = "a";
dann könnte man vergleichen text
mit text2
, und es sollte wahr
Vielleicht solltest du nicht vergessen zu verwenden {
und }
=)
void main() {
if("a" == "a")
{
printf("Yes, equal");
}
else
{
printf("No, not equal");
}
}
void main
??? Ew ...