2013-09-07 2 views
-2
#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
int a=10,b=11; 
clrscr(); 
printf("%d"); 
getch(); 
} 

Выход = 11 Как вывод 11, даже я не упоминал имя переменной в функции printf.Пожалуйста, объясните эту программу C

+6

Ваша программа имеет неопределенное поведение. * Все, что могло бы сделать, было бы правильным. –

+0

http://stackoverflow.com/search?tab=newest&q=undefined%20behavior Многие дубликаты. –

ответ

5

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

Если вы добавите c=47, вы, вероятно, получите 47. Но это неопределенное поведение.

+1

Plus, если компилятор решает оптимизировать «a» и «b», выход будет просто мусором. – nneonneo

+0

Я не очень хорошо знаком с varargs в C. Является ли он отличным от varargs в C++? –

3

Это называется «неопределенное поведение», что означает, что программа может делать что угодно.

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

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

+0

Привет. Извините, что добавил вопрос к вопросу. Не следует ли, чтобы 'printf ("% d ");' был помечен компилятором как ошибка? –

+0

Он отображается как ошибка, если вы включаете предупреждения. – vy32

+1

@LittleChild: компилятор не должен жаловаться на это, хотя некоторые делают с соответствующим уровнем предупреждения. –

Смежные вопросы