Неправильное количество параметров для printf приводит к странным результатам

#include <stdio.h>

int main() {
   int i=10,j=20;
   printf("%d%d%d",i,j);
   printf("%d",i,j); 
   return 0;
}

Используя компилятор Turbo C, вывод выглядит так:

10 10 garbageValue

20

Может кто-нибудь объяснить, почему это так?

5 ответов

Решение

Какой компилятор вы используете? Я проверил его на компиляторах Turbo C v2.0 и Turbo C++ V 4.5 и вывод

10 20 garbage value

10 

Это фактический результат, который вы получите, используя только две переменные и три спецификатора формата. Таким образом, он напечатает значения, хранящиеся в двух переменных, и выведет значение мусора.

Во втором случае вы используете только один спецификатор формата и две переменные, поэтому в этом случае он напечатает только одно значение, сохраненное в переменной, и пропустит другую переменную. Вы можете получить приведенный выше вывод, если скомпилируете его с помощью компиляторов turbo c 2.0 и turbo C++ 4.5.

Первый звонок printf() имеет слишком много спецификаторов формата, что приводит к неопределенному поведению. В этом случае выводится значение мусора.

printf("%d%d%d",i,j); =>

Вы предлагаете printf напечатать три целых числа, но вы предоставляете только три, поэтому printf выводит часть мусора из стека. другой:

printf("%d",i,j);

предполагается взять только одно целое число, но вы передаете два. Язык C не защищает от таких ошибок, и то, что происходит, совершенно не определено, поэтому объяснить, как именно вы видите эти выходные данные, сложно, если вы не знаете свой внутренний компилятор, и не очень полезно, поскольку этот код неправильный и ожидается сбой.

Поведение не определено, то есть спецификация языка не говорит, что происходит в этом случае. Это полностью зависит от реализации компилятора и архитектуры вашей системы. Объяснение неопределенного поведения может быть иногда занимательным, часто сводящим с ума, и почти всегда бесполезным - так что не беспокойтесь об этом!

Все ваши спецификаторы формата перепутаны, и я не думаю, что код, который вы разместили, является вашим реальным кодом. На моем компиляторе Visual Studio я вижу это:

1020010

каждый %d обозначает место, где printf должен вставить одно из ваших целочисленных значений.

printf("%d%d%d",i,j);

Вы сказали printf ожидать три, но вы дали только два. Возможно, Turbo C делает что-то иное с аргументами, скрытыми под капотом, но вам все равно нужно сопоставить спецификаторы формата с вашими аргументами:

printf("%d%d",i,j);
Другие вопросы по тегам