Неправильное количество параметров для 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);