Подтвердить что ты не робот

Почему процентный символ не сбрасывается с помощью обратного слэша в C?

Документация printf() гласит, что если кто-то хочет напечатать % в C, он может использовать:

printf("%%")

Почему это не так:

printf("\%")

как с другими специальными символами?

4b9b3361

Ответ 1

Поскольку % обрабатывается printf. Это не особый символ в C, но printf сам относится к нему по-другому.

Ответ 2

Обратная интерпретация обрабатывается компилятором при интерпретации исходного текста программы. Таким образом, общий результат заключается в том, что исходный текст "\%" создает строку, содержащую "%".

Строка формата интерпретируется подпрограммой printf, поэтому обрабатывает переданные ей символы. К этому времени обратная косая черта больше не присутствует, поэтому printf ее никогда не видит.

Технически, \% не является законным в строковом литерале. Символ \ запускает escape-последовательность, и единственные законные escape-последовательности перечислены в C 2011 6.4.4.4 1. Они \, за которыми следуют ', ", ?, \, a, b, f, n, r, t, v, от одной до трех восьмеричных цифр, x и шестнадцатеричных цифр, u и четырех шестнадцатеричных цифр, или u и восемь шестнадцатеричных цифр.

Если printf был спроектирован так, чтобы обратная косая черта сбежала от процента, тогда вам придется передать ему обратную косую черту, экранируя обратную косую черту в исходном тексте, поэтому вам нужно будет написать:

printf("\\%");

Ответ 3

Соглашение состоит в том, что специальные символы уходят из себя. Таким образом, вместо того, чтобы использовать обратную косую черту, чтобы избежать процента, она ускользает. (Обратите внимание, что для передачи обратного слэша в printf вам нужно написать строковый литерал как "\\%".)

Ответ 4

Вы можете это сделать!!!!!

#include <iostream>
#include <string>
#include "stdio.h"
using namespace std;



int main(int argc, char **argv)
{


    printf("hhhhhhh %s \n","\%");
    printf("hhhhhhh  \n");

    return 0;
}

Проблема существует с printf и отличается от используемого вами компилятора. С помощью wxWidget lib вы не можете использовать printf с двумя escape-последовательностями

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

Не пойди. Но если вы используете

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

вы правы. Плюс