2014-04-21 3 views
3

Le code suivant, provient de l'article C++ quirks, part 198276std :: comparaison de chaînes, lexicographique ou non

include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    std::string a = "\x7f"; 
    std::string b = "\x80"; 
    cout << (a < b) << endl; 
    cout << (a[0] < b[0]) << endl; 

    return 0; 
} 

Étonnamment, le output est

1 
0 

ne doit pas être comparaison de chaînes lexicographique? Si oui, comment s'explique la sortie?

+0

Avez-vous lu l'explication fournie sur le site? Qu'en est-il de cette explication qui n'a pas de sens pour vous? –

+0

@sharth Il semble violer ce que [comparaison lexicographique] (http://en.wikipedia.org/wiki/Lexicographical_order) est; à la fois comme un concept mathématique et comme un concept de programmation. La question est à ce sujet: «La comparaison des chaînes ne devrait-elle pas être lexicographique?» Pourquoi la nécessité de passer outre à une définition bien établie? Devrions-nous nous inquiéter chaque fois que «lexicographique» apparaît dans la norme, suis-je (en quelque sorte) préoccupé par une seule exception? Je veux dire que c'est la taxonomie des préoccupations émises en faisant un détour autour d'un concept solide. –

+0

Notez que [Ordre lexicographique] (http://en.wikipedia.org/wiki/Lexicographical_order) n'est pas [Ordre alphabétique] (http://en.wikipedia.org/wiki/Alphabetical_order). Nous trions les cordes lexicographiquement. Pour les trier par ordre alphabétique, vous avez besoin d'informations sur l'encodage des caractères. Un 'std :: string' ne stocke aucune information à ce sujet, ce qui signifie qu'il ne sait pas si un caractère particulier de la chaîne est' A' ou '©'. –

Répondre

2

Il n'y a rien dans la spécification C++ pour dire si char est signed ou unsigned, c'est au compilateur. Pour votre compilateur, il semble que char par défaut à signed char, ce qui explique pourquoi la seconde comparaison renvoie false.

+0

J'ai essayé pour les nombres inférieurs à 7F et j'ai obtenu les deux résultats identiques. Votre explication semble parfaite. – vishram0709

2

Je vais juste citer directement your link:

Il se trouve que ce comportement est requis par la norme, dans la section 21.2.3.1 [char.traits.specializations.char]: « les membres deux arguments eq et lt sont définis de façon identique aux opérateurs intégrés == et < pour le type unsigned char «

donc:.

  • (a < b) est requis pour utiliser les comparaisons unsigned char.
  • (a[0] < b[0]) est nécessaire pour utiliser les comparaisons char, signées ou non.