#include<stdio.h>
#include<conio.h>
void main()
{
int a=10,b=11;
clrscr();
printf("%d");
getch();
}
Выход = 11 Как вывод 11, даже я не упоминал имя переменной в функции printf.Пожалуйста, объясните эту программу C
#include<stdio.h>
#include<conio.h>
void main()
{
int a=10,b=11;
clrscr();
printf("%d");
getch();
}
Выход = 11 Как вывод 11, даже я не упоминал имя переменной в функции printf.Пожалуйста, объясните эту программу C
11 находится в стеке из-за переменной b
, и ваша функция printf()
смотрит на стек для значения в стеке, потому что это где переменные передаются.
Если вы добавите c=47
, вы, вероятно, получите 47. Но это неопределенное поведение.
Plus, если компилятор решает оптимизировать «a» и «b», выход будет просто мусором. – nneonneo
Я не очень хорошо знаком с varargs в C. Является ли он отличным от varargs в C++? –
Это называется «неопределенное поведение», что означает, что программа может делать что угодно.
Что в действительности происходит в этом случае, так это то, что как переменные, так и функциональные параметры помещаются в стек. Поскольку вы не передаете параметр, который ожидает printf, он в конечном итоге вытаскивает что-то еще из стека, которое является вашей переменной b
.
Но поскольку это неопределенное поведение, если у вас был другой компилятор, другой процессор или даже разные параметры компиляции, такие как более высокий уровень оптимизации, вы могли получить совсем другие результаты.
Привет. Извините, что добавил вопрос к вопросу. Не следует ли, чтобы 'printf ("% d ");' был помечен компилятором как ошибка? –
Он отображается как ошибка, если вы включаете предупреждения. – vy32
@LittleChild: компилятор не должен жаловаться на это, хотя некоторые делают с соответствующим уровнем предупреждения. –
Ваша программа имеет неопределенное поведение. * Все, что могло бы сделать, было бы правильным. –
http://stackoverflow.com/search?tab=newest&q=undefined%20behavior Многие дубликаты. –