Quali garanzie ha il C++ sull'ordinamento dei caratteri letterali? Esiste un ordinamento preciso di caratteri nel set di caratteri di origine ? (Ad esempio, è 'a' < 'z'
garantita per essere vero? Che ne dite di 'A' < 'z'
?)Quali garanzie ha il C++ sull'ordinamento dei caratteri letterali?
risposta
Lo standard fornisce solo una garanzia per l'ordinazione delle cifre decimali 0
a 9
, dal progetto di C++ 11 sezione standard 2.3
[lex.charset]:
sia la sorgente e l'esecuzione set di caratteri di base, il valore di ogni carattere dopo 0 nell'elenco precedente di cifre decimali è uno maggiore del valore del precedente.
ed al contrario dice (sottolineatura mia):
Il set di caratteri esecuzione di base e la base set di caratteri estesi esecuzione devono essere dotate di tutti i membri del set di caratteri fonte di base, più caratteri di controllo che rappresentano avviso, backspace e ritorno a capo, oltre a un carattere null (rispettivamente, carattere di larghezza nullo), la cui rappresentazione ha tutti i bit zero. Per ciascun set di caratteri di esecuzione di base , , i valori dei membri devono essere non negativi e distinti l'uno dall'altro.
Nota, EBCDIC ha un set di caratteri non consecutivi.
Un'implementazione davvero malvagia potrebbe avere "'z' == 'a' + 25' e _still_ avere' 'b' <'a''. Credo che questo sia piuttosto sottodescritto, anche tenendo conto di EBCDIC e SMS. – MSalters
Il fatto che non ci sia alcuna garanzia dimostra ancora una volta che a volte è una buona idea dare il proprio supporto ad alcune implementazioni, che possono essere "più". Un buon esempio a mio parere è che Qt si attenga alle implementazioni che hanno 'sizeof (int) == 4' ... Tutti i compilatori che vogliono supportare lo garantiscono, ma ovviamente non tutti, ma se ci si limita a tali implementazioni, può rendere la vita molto più facile. Tuttavia, devi stare attento e conoscere le implementazioni a cui ti stai attenendo, oltre a considerare una tale limitazione dipendente dall'applicazione, ovviamente. – leemes