Почему '?' а также '\?' дать тот же результат в C?

В C, почему эти две части кода дают один и тот же результат?

#include<stdio.h>

int main(void)
{
    const char c='\?';
    printf("%c",c);
}

а также

#include<stdio.h>

int main(void)
{
    const char c='?';
    printf("%c",c);
}

Я понимаю, что обратная косая черта используется для создания кавычек (" или ') и обратной косой черты, очевидной для компилятора, когда мы используем printf(), но почему это работает для "?"?

Ответы

Ответ 1

\? является escape-последовательность, в точности эквивалентная ? , и используется для выхода из триграфов:

#include <stdio.h>
int main(void) {
    printf("%s %s", "??=", "?\?="); // output is # ??=
}

Ответ 2

Цитирование C11, глава §6.4.4.4p4

The double-quote " и question-mark ? are representable either by themselves or by the escape sequences \" и \?, respectively, but ....

Акцент мой

Таким образом, escape-последовательность \? обрабатывается так же, как и ?.

Ответ 3

Потому что '\?' является допустимым кодом эвакуации и равен вопросительному знаку.

Ответ 4

когда вы определяете char или string компилятор анализирует обратную косую черту в этом char или string как escape-последовательность.