Pourquoi le pourcentage de caractère n’est-il pas échappé avec une barre oblique inverse en C?

La documentation printf() indique que si quelqu’un veut imprimer % en C, il peut utiliser:

 printf("%%") 

Pourquoi n’est-ce pas:

 printf("\%") 

comme avec d’autres personnages spéciaux?

    Parce que le % est géré par printf . Ce n’est pas un caractère spécial en C, mais printf lui-même le traite différemment.

    La barre oblique inversée est traitée par le compilateur lors de l’interprétation du texte source du programme. Le résultat courant est donc que le texte source "\%" génère une chaîne contenant “%”.

    La chaîne de format est interprétée par la routine printf , elle traite donc les caractères qui lui sont transmis. À ce stade, la barre oblique inverse n’est plus présente. Par conséquent, printf ne le voit jamais.

    Techniquement, \% n’est pas légal dans un littéral de chaîne. Le caractère \ commence une séquence d’échappement et les seules séquences d’échappement légales sont répertoriées dans C 2011 6.4.4.4 1. Elles sont suivies de ' , " , ? , \ , \ , A, b , f , n , r , t , v , un à trois chiffres octaux, x et chiffres hexadécimaux, u et quatre chiffres hexadécimaux, ou U et huit chiffres hexadécimaux.

    Si printf avait été conçu de manière à ce qu’une barre oblique inverse échappe à un pour cent, vous devrez alors la transmettre à une barre oblique inversée en masquant la barre oblique inverse du texte source. Vous devrez donc écrire:

     printf("\\%"); 

    La convention veut que des caractères spéciaux s’échappent. Ainsi, plutôt que d’utiliser une barre oblique inverse pour échapper au pourcentage, elle s’échappe elle-même. (Notez que pour passer une barre oblique inversée à printf , vous devez écrire le littéral de chaîne sous la forme "\\%" .)

    Tu peux le faire !!!!!

     #include  #include  #include "stdio.h" using namespace std; int main(int argc, char **argv) { printf("hhhhhhh %s \n","\%"); printf("hhhhhhh \n"); return 0; } 

    Le problème existe avec printf et diffère du compilateur que vous utilisez. Avec wxWidget lib, vous ne pouvez pas utiliser printf avec deux séquences d’échappement.

     printf(" xxxxxx \0x81 xx \0x82 xx \n"); 

    ne pars pas. Mais si vous utilisez

     printf(" xxxxxx %s xx %s \n","\0x81","\0x82"); 

    tu as raison. Un plus