Qui détermine l’ordre des personnages

J’ai une requête basée sur le programme ci-dessous –

char ch; ch = 'z'; while(ch >= 'a') { printf("char is %c and the value is %d\n", ch, ch); ch = ch-1; } 

Pourquoi l’impression de lettres minuscules n’est-elle pas garantie dans le programme ci-dessus? Si C ne donne pas beaucoup de garanties sur l’ordre des caractères sous forme interne, alors qui le fait et comment?

L’implémenteur du compilateur choisit son jeu de caractères sous-jacent. La norme ne dit que ce qu’un nombre minimal de caractères doit être disponible et que les caractères numériques sont contigus.

Les caractères requirejs pour un environnement d’exécution C99 sont A à Z , a à z , 0 à 9 (qui doivent être ensemble et dans l’ordre), n’importe lequel de !"#%&'()*+,-./:;<=>?[\]^_{|}~ , espace, onglet horizontal, onglet vertical, saut de page, alerte, retour arrière, retour à la ligne et nouvelle ligne, ce qui rest inchangé dans le brouillon actuel de C1x, la prochaine itération de cette norme .

Tout le rest dépend de la mise en œuvre.

Par exemple, un code comme:

 int isUpperAlpha(char c) { return (c >= 'A') && (c <= 'Z'); } 

se briseront sur le grand système qui utilise EBCDIC, en divisant les caractères majuscules en deux régions.

Le code réellement portable en tiendra compte. Tout autre code doit documenter ses dépendances.

Une implémentation plus portable de votre exemple ressemblerait à ceci:

 static char chrs[] = "zyxwvutsrqponmlkjihgfedcba"; char *pCh = chrs; while (*pCh != 0) { printf ("char is %c and the value is %d\n", *pCh, *pCh); pCh++; } 

Si vous voulez une vraie solution portable, vous devriez probablement utiliser islower() car le code islower() uniquement les caractères latins ne sera pas portable (par exemple) en grec en utilisant Unicode pour son jeu de caractères sous-jacent.

Pourquoi l’impression de lettres minuscules n’est-elle pas garantie dans le programme ci-dessus?

Parce qu’il est possible d’utiliser C avec un codage de caractères EBCDIC , dans lequel les lettres ne sont pas consécutives.

De toute évidence, cela dépend de l’implémentation de C que vous utilisez, mais il est plus que probable que cela soit déterminé par le code ASCII ( American Standard Code for Information Interchange ).

Il est déterminé par le jeu de caractères d’exécution.

De nos jours, dans la plupart des cas, il s’agit du jeu de caractères ASCII, mais C n’exige pas qu’un jeu de caractères spécifique soit utilisé.

Notez qu’il existe certaines garanties concernant l’ordre des caractères dans le jeu de caractères d’exécution. Par exemple, les chiffres «0» à «9» ont la garantie que chacun a une valeur supérieure de un à la valeur du chiffre précédent.

De nos jours, les gens qui appellent votre code non portable s’engagent dans un pédantisme inutile. La prise en charge des codages incompatibles avec ASCII rest uniquement dans la norme C en raison des ordinateurs centraux EBCDIC hérités qui refusent de mourir. Vous ne rencontrerez jamais de codage de caractères incompatible avec ASCII sur un ordinateur moderne, maintenant ou à l’avenir. Donnez-lui quelques décennies et vous ne rencontrerez jamais que le format UTF-8.

Pour répondre à votre question sur le choix du codage des caractères: même si, lors de la mise en œuvre de votre implémentation (compilateur C, bibliothèque et système d’exploitation), il a été décidé par Internet, à la fois par la pratique existante et par les normes IETF. Les systèmes modernes sont vraisemblablement conçus pour communiquer et interagir les uns avec les autres, et il serait extrêmement difficile de convertir chaque en-tête de protocole, fichier HTML, source JavaScript, nom d’utilisateur, etc. entre un codage compatible ASCII et le code EBCDIC, voire d’autres. autre désordre local.

Ces derniers temps, il est devenu évident qu’un codage universel, non seulement pour le texte analysé par la machine, mais également pour le texte en langage naturel, est également hautement souhaitable. (L’échange de texte en langage naturel n’est pas aussi fondamental que le texte analysé par machine, mais rest très commun et important.) Unicode a fourni le jeu de caractères et, en tant que seul codage Unicode compatible ASCII, UTF-8 est à peu près le successeur de l’ASCII. l’encodage universel des caractères.

Je te réponds trop tard mais en dehors de ce qui a déjà été dit, je veux append un peu

À la 5ème phase de traduction (partie du préprocesseur), chaque membre du jeu de caractères source est converti en caractère correspondant du jeu de caractères d’exécution. Citation de l’ ISO 9899 , 5.1.1.2p5

  1. Chaque membre du jeu de caractères source et séquence d’échappement dans les constantes de caractère et les littéraux de chaîne est converti en membre correspondant du jeu de caractères d’exécution; s’il n’y a pas de membre correspondant, il est converti en un membre défini par l’implémentation autre que le caractère nul (large). 7)

Il n’est pas nécessaire que le jeu de caractères source soit identique au jeu de caractères d’exécution; comme d’autres le disent, si le jeu de caractères d’exécution est EBCDIC de l’ordinateur central d’IBM , la logique n’est pas la même que dans le cas du jeu de caractères ASCII.