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?
Avez-vous lu l'explication fournie sur le site? Qu'en est-il de cette explication qui n'a pas de sens pour vous? –
@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. –
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 '©'. –