2012-11-28 2 views
5

La mia domanda sembra probabilmente abbastanza stupida, ma devo rispondere mentre mi preparo all'esame di laurea.L'espressione 'ab' == "ab" true in C++

Quindi, cosa ne pensi di una tale espressione 'ab' == "ab" in C++? Questo non è vero o semplicemente non è un errore legale e di compilazione? Googled un po 'e arrivare a sapere che 'ab' è di tipo int e "ab" Certo che no ...

devo considerare non ciò che compilator dice ma quello che dice descrizione formale del linguaggio ..

+2

Il compilatore dovrebbe essere una buona indicazione dello standard se conforme allo standard. – chris

+0

http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters questo potrebbe aiutare –

+0

risposta obbligatoria a qualsiasi "questo compila?" domanda: hai provato a compilarlo? – Kevin

risposta

4

Genera sicuramente un avviso, ma per impostazione predefinita, gcc lo compila. Dovrebbe essere normalmente falso.

Detto questo, dovrebbe essere teoricamente possibile, ovviamente a seconda della piattaforma su cui si sta eseguendo, di avere la costante in fase di compilazione "ab" in una posizione di memoria il cui indirizzo è uguale in valore numerico al valore numerico di 'ab', caso in cui l'espressione sarebbe vera (sebbene il confronto sia ovviamente privo di significato).

1

Sta per darti un avvertimento, ma lo farà. Quello che farà è confrontare il numero intero multibyte "ab" con l'indirizzo della stringa letterale "ab".

In conclusione, il risultato del confronto non riflette la scelta di lettere uguali o meno.

0

Lo standard non ha assolutamente nulla da dire sul confronto di un tipo integrale con un puntatore. Tutto ciò che dice è la seguente (nella sezione 5.9):

The operands shall have arithmetic, enumeration, or pointer type, or type std::nullptr_t...

Si passa quindi in una descrizione dettagliata su ciò che significa per confrontare due puntatori, e cita il confronto di due numeri interi. Quindi la mia interpretazione della mancanza di specifiche sarebbe "qualunque cosa decida il compilatore", che è un errore o un avvertimento.

+1

In realtà, la mancanza di specifiche nello standard produce un comportamento indefinito. Suppongo che ciò possa significare "qualunque cosa decida il compilatore", ma potrebbe essere confuso con Unspecified Behaviour. Il comportamento di Unspec produce un programma ben formato, ma il comportamento di Undef no. –

0

Consideriamo questo per le parti in C semplice, la 'c' è un carattere semplice se si desidera manipolare le stringhe si dovrà utilizzare una matrice di caratteri, di conseguenza 'ca' non dovrebbe funzionare nel modo previsto e in C++ questa roba è ancora valida. Se si desidera utilizzare le stringhe, sarà necessario utilizzare la classe String, che non è un tipo non elaborato. E tutto ciò che fa è una classe con metodi e tipo def in modo da gestire i caratteri degli array più facilmente. Come risultato anche la stringa in stile C e l'array di caratteri sono cose diverse, in quanto il risultato 'ab' == "ab" non darà una risposta booleana valida. È come provare a confrontare un int con una stringa. Quindi, questo comaprio probabilmente genererà un errore.

4

In entrambe le espressioni C e C++ 'ab' == "ab" non è valido. Non ha significato. Nessuna lingua consente di confrontare i valori integrali arbitrari con i valori del puntatore. Per questo motivo, il fatto che sia "vero" o no non si pone neppure. Per trasformarlo in un'espressione compilabile è necessario eseguire il cast esplicito degli operandi su tipi comparabili.

L'unica scappatoia è che il valore della costante di carattere multi-carattere è definito dall'implementazione. Se in alcune implementazioni il valore di 'ab' risulta pari a zero, può fungere da costante con puntatore nullo. In tal caso, 'ab' == "ab" diventa equivalente a 0 == "ab" e NULL == "ab". Questo è garantito essere falso.