#include<stdio.h>
main()
{
printf("% % % %");
}
Для вышеуказанной программы выход равен%%. Но почему? (Я использовал gcc-компилятор).Почему% печатается пополам в C?
#include<stdio.h>
main()
{
printf("% % % %");
}
Для вышеуказанной программы выход равен%%. Но почему? (Я использовал gcc-компилятор).Почему% печатается пополам в C?
Это интересно. %% считается как %% каким-то образом, да. Должно быть в правилах разбора для форматов printf в библиотеке stdio. В общем случае «%» не является точно допустимой спецификацией формата. %% %% %% %% предоставит вам то, что вы хотите.
Неопределенное поведение вызывается с использованием недопустимого спецификатора формата.
N1570 7.21.6.1 Функция fprintf говорит в описании %
спецификатором преобразования:
Полная спецификация преобразования должна быть %%.
N1570 4. Соответствие говорит:
Если «» должен «» или «» не должны «» требование, которое появляется за пределами ограничений или выполнения-ограничение нарушается, то поведение не определено ,
Описание спецификатора преобразования %
находится в разделе «Описание», а не в разделе ограничения или ограничения времени исполнения.
В реальной РЕАЛИЗАЦИИ, поведение системы кажется, что это:
%
и начать разбор Тендерного
и сохранить его как флаг%
и относиться к нему как %
спецификатор преобразования
после этого и распечатайте его, поскольку он не является частью Спецификатор% %
и работают как 1-3Ах, да, вы старое «неопределенное поведение». Интересно, как много зависит от этого. Предоставлены ли повышенные предупреждения выше этого? Это техническая ошибка времени выполнения, хотя статический анализ во время компиляции возможен в этом случае. – BenPen
Я бы не попытался рационализировать это поведение, так как пробел не может быть флагом, модификатором, спецификатором. Это просто неопределенное поведение. – 2501
@ 2501 Пробел - это флаг, который сообщает системе распечатать пробел в качестве знака для неотрицательных целых чисел. Например, '% d' является допустимым спецификатором формата. – MikeCAT
Вы можете компилировать с '-Wall -Wextra -Wpedantic'. – EOF
Пожалуйста, прочитайте ссылку [printf] (http://en.cppreference.com/w/cpp/io/c/fprintf) о ее параметре 'format' – mvidelgauz
@mvidelgauz. Лучше было бы ссылаться на сайт C, хотя , правильно? –