Ответ 1
Отлично! Вы должны отправить отчет о дефектах для C11!
Вот соответствующая часть в C11 7.21.6.2
... Спецификатор преобразования включает в себя все последующие символы в строке формата, вплоть до подходящей правой скобки (]). Символы между скобками (список сканирования) составляют сканирование, если только символ после левого скобки не является обходным (^), и в этом случае сканирование содержит все символы, которые не отображаются в списке сканирования между округлой и правой скобками.
Строгая интерпретация символов между скобками заключается в том, что в отсутствие закрывающей скобки таких символов нет, но в присутствии ^
в качестве первого символа после [
это было бы непоследовательно. gcc
достаточно любезен, чтобы указать вероятную ошибку в исходном коде. Фактическое поведение определяется реализацией библиотеки C, но, как представляется, не указано в стандарте C. Таким образом, это форма поведения undefined, которую IMHO должно действительно документировать как таковое в Стандарте.