2013-08-27 3 views
0

Я не могу понять вывод следующей программы на C, любую идею?Не могу понять вывод следующей программы на языке C

#include<stdio.h> 

#include<conio.h> 

void main() 

{ 
    int a=5,b=6,c=11; 

    clrscr(); 

    printf("%d %d %d"); 

    getch(); 
} 

Вывода этой программы:

Я не могу понять, почему выше программы дают нам обратное значение переменного в Printf я никогда не объявлял, какое значение имеет для print ... Итак, есть ли какая-либо теория, что если мы не объявляем, какую переменную нужно печатать, мы получаем обратное значение переменных, которые мы выше объявили в типе данных ...

+10

Похоже на неопределенное поведение для меня, другими словами, удачу, что он печатает что-то даже отдаленно релевантное. –

+1

Это неопределенное поведение, и я уверен, что где-то есть дубликат. –

+0

Попробуйте использовать другой компилятор, и вы получите случайный результат (например, clang или gcc) – Geoffroy

ответ

13

Это undefined behavior, и вы не должны ожидать, конкретный результат (или объяснение), если вы не заботитесь о конкретных деталях реализации.

Что может быть напечатано (случайное, то есть «непредсказуемое») значение мусора, содержащееся в некоторых местах стека или регистры, которые должны содержать аргументы.

BTW, некоторые компиляторы (то есть GCC при вызове с gcc -Wall) предоставят вам предупреждение. Старайтесь избегать их (исправляя исходный код).

+0

Это похоже на то, что многие вещи попадают под скобки неопределенного поведения, когда дело доходит до С или есть список? – Sid

+5

Я считаю, что более важно понять определенное поведение (и семантику) C, чем пытаться перечислить все возможные случаи неопределенного поведения. –

0

Вывод вышеуказанной программы зависит от компилятора. Потому что это неопределенное поведение.

Turbo C даст вам результат, который вы ожидали. Попробуйте выполнить некоторую операцию перед выполнением printf. Вы не получите ожидаемый результат. Потому что printf напечатает последние записи stack.

Если вы скомпилируете ту же программу, используя gcc under linux, вы получите предупреждение.

+0

С 'gcc' вы получаете предупреждение при * компиляции * времени (не во время выполнения, как предлагалось), по крайней мере, при компиляции с помощью' gcc -Wall' –

+0

Обновленный gcc-компилятор дает предупреждение во время самого компиляции. Я использую gcc версии 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) – sujin

+0

Тогда скажите «Если вы скомпилируете ту же программу с помощью' gcc' под Linux » –

4

printf использует стек для хранения и последующей печати данных. В этом случае первый идет в то Ь, а затем с .При Printf выскакивает элементы, первый гр выходит тогда б затем

2

Существует очень хорошее объяснение справа here. Во время выполнения программа просто распечатает то, что находится в стеке, которое, оказывается, является вашими переменными.

2

Для справки

ИНТ Е (Const символ * формат, ...);

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

Как Joachim сказал в ответ вы получили это по простой luck.You не может предсказать точные результаты.

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