ISO C ++ verbietet den Vergleich zwischen Zeiger und Integer [-fpermissiv] | [C ++]

8

Ich versuche den folgenden Code auf Ubuntu (64-bit) zu kompilieren, mit Code :: Blocks 10.05 als IDE:

%Vor%

In Zeile 7 gibt mein Compiler den Fehler "ISO C ++ verbietet den Vergleich zwischen Zeiger und Integer [-fpermissive]".

Warum funktioniert das nicht? Ich weiß, dass ich ein std::string verwenden könnte, um das Problem zu umgehen, aber ich möchte das aktuelle Problem verstehen.

    
iyazici 14.02.2012, 16:57
quelle

2 Antworten

12

char a[2] definiert ein Array von char s. a ist ein Zeiger auf den Speicher am Anfang des Arrays und die Verwendung von == vergleicht nicht wirklich den Inhalt von a mit 'ab' , weil sie nicht die gleichen Typen sind, 'ab' ist eine ganze Zahl Art. Auch 'ab' sollte "ab" sein, sonst haben Sie auch hier Probleme. Um Arrays von Char zu vergleichen, sollten Sie strcmp verwenden.

Etwas, das illustrativ sein könnte, ist die typeid von 'ab' :

%Vor%

auf meinem System gibt dies zurück:

%Vor%

zeigt, dass 'ab' tatsächlich als int ausgewertet wird.

Wenn Sie dasselbe mit einem std :: string tun würden, dann würden Sie sich mit einer Klasse beschäftigen und std :: string hat operator == überladen und wird eine Vergleichsüberprüfung durchführen, wenn Sie auf diese Weise aufgerufen werden.

Wenn Sie die Eingabe mit der Zeichenfolge "ab" in einer idiomatischen C ++ - Weise vergleichen möchten, schlage ich vor, Sie tun es so:

%Vor%     
shuttle87 14.02.2012 16:59
quelle
5

Dies ist wegen:

if(a=='ab') , hier, a ist const char* type (dh: Array von Zeichen)

'ab' ist ein konstanter Wert, der nicht als String (wegen des einfachen Zitats) ausgewertet wird, sondern als Integer ausgewertet wird.

Da char ein primitiver Typ ist, der von C geerbt wurde, ist kein Operator == definiert.

Der gute Code sollte sein:

if(strcmp(a,"ab")==0) , dann vergleichen Sie eine const char* mit einer anderen const char* mit strcmp .

    
dweeves 14.02.2012 17:00
quelle

Tags und Links