Печать выписки в к - PullRequest
       5

Печать выписки в к

0 голосов
/ 30 сентября 2019

Что если мы просто дадим строку формата в выражении printf в c, например:

printf("%d, %d, %d",a, b); 

Что дает третий %d ответ In?

Я сделал это, но не смогпонять вывод кода.

Ответы [ 3 ]

4 голосов
/ 30 сентября 2019

Третий% d дает в ответе неопределенное поведение, потому что нет соответствующего аргумента.

Из стандарта C (7.21.6.1 функция fprintf)

9 Если преобразованиеспецификация недопустима, поведение не определено.275) Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено.

Обратите внимание, что имя стандартной функцииprintf не Printf.

0 голосов
/ 30 сентября 2019

Вы сказали printf ожидать 3 дополнительных int аргумента, но только передали 2. Он будет искать этот третий int аргумент где-то , и в зависимости от того, как printfреализован в вашей системе, вы можете получить ошибку во время выполнения, или вы можете увидеть вывод мусора, или вы можете увидеть вывод no , или может произойти что-то совсем другое.

Официально, поведение оставлено undefined - ни компилятор, ни среда выполнения, в которой выполняется программа, не должны обрабатывать ситуацию каким-либо особым образом. Результат не гарантируется быть предсказуемым или повторяемым.

Здесь нет «следует» - любой результат является «правильным» в том, что касается определения языка.

0 голосов
/ 30 сентября 2019

В C функции, принимающие переменные аргументы (то есть параметр ...), не могут заранее знать количество или тип аргументов. Их нужно как-то отслеживать. Отдельный параметр длины можно использовать только одним способом, но функции семейства printf используют количество спецификаторов формата в строке формата для отслеживания.

Если вы скажете функции «эй, есть третий параметр», когдаВы не пропустите один, это неопределенное поведение. Все может случиться. Может показаться, что ничего не печатать. Он может прочитать значение мусора из ячейки памяти или из регистра, где он ожидает найти это значение. Может произойти сбой.

Рассуждение о том, что может произойти, когда ваш код вызывает неопределенное поведение, - пустая трата времени. Просто убедитесь, что ваш код свободен от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...