2012-02-23 2 views
0

есть кто-нибудь, кто может дать мне жизненно и простое объяснение им пытаются понять эту программу ниже о Printf в программирования C здесь код ......выход на Printf

#include <stdio.h> 
    int main() 
    { 
    int a,b; 
    float c; 
     a = 1; 
     b = 2; 
     c = 3.; 

    printf("%d %d %f\n",a ,b , c); 
    printf("%d %f %f\n",a ,b , c); 
    printf("%f %d %f\n",a ,b , c); 
    printf("%d %d %d\n",a ,b , c); 
    printf("%f %d %d\n",a ,b , c); 
    return o; 

    } 

выход

1 2 3.000000 
1 0.000000 0.000000 
0.000000 0 0.000000 
1 2 0 
0.000000 0 1074266112 

им совершенно ясно, о выходе первого PRINTF в , но почему второй PRINTF выходы 1 0.000000 0.000000

вместо 1 0.000000 3.000000

третий Printf 0.000000 0 3.000000

пятого Printf 0.000000 2 0.000000

+0

2-й «printf» мог также напечатать «Привет, мир!». ... или отформатируйте жесткий диск ... или сделайте лимонный сок из USB-порта :) – pmg

+0

где 'o' определено? Вы не можете вернуть какой-либо неопределенный объект. – pmg

ответ

6

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

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

3

При передаче int в printf() и сказать ему, чтобы рассматривать его как float, вы получите мусор, соответствующий мусор в (Гиго). В принципе, ни printf(), ни компилятор не могут делать никаких конверсий для вас. Вы должны все исправить. Вы должны указать аргументы, соответствующие спецификации формата. Эти комментарии относятся ко всем семействам функций и scanf().

Если вы используете GCC и строковые литералы как строки формата (как в вашем примере), вы получите предупреждения компилятора о несоответствиях типов. Обратите внимание и исправьте их; компилятор знает больше, чем вы. Если вы используете другой компилятор, который не дает таких предупреждений, найдите один (такой как GCC), который делает - и используйте его. И убедитесь, что вы включили предупреждения, и что ваш код компилируется без каких-либо предупреждений.

Вы вызываете «неопределенное поведение» со вторым и последующим операциями, что означает, что все ответы (и другие варианты поведения, включая сбои и переформатирование вашего диска) являются приемлемыми ответами системы.

2

Вы работаете на undefined поведение. Ожидание ожидает float, и вы даете ему int.

2

Чтобы расширить приведенные выше ответы и дать представление о том, что вызывает неопределенное поведение. На вашей платформе поплавки имеют разный размер, чем ints, поэтому printf() ошибочен не только по типу его аргументов, но и по тому, где они находятся в памяти. Поэтому во второй строке printf не смотрит на начало поплавка, когда печатает третье значение; он смотрит где-то в другом месте.

+1

Какие платформы имеют 'sizeof (int)! = Sizeof (float)'? На подавляющем большинстве настольных компьютеров, ноутбуков, серверных систем 'sizeof (int) == sizeof (float)' и оба они равны 4.Однако, конечно, значения 'float' повышаются до' double' в переменной части списка аргументов, а затем вы получаете несоосности, потому что 'sizeof (int)! = Sizeof (double)' на большинстве платформ. –

+0

@ Джонатан Леффлер - Верно, я забыл о продвижении поплавка. Замечу, что в 16-разрядных системах (например, DOS с малой моделью памяти) ints меньше, чем float. – antlersoft

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