2013-05-24 2 views
-1

Если я пытаюсь напечатать float как int, этот код:Может кто-нибудь объяснить выход

main() {       
    float a = 6.8f;      
    printf("%d", a);      
}      

печатает 1073741824, в то время как этот код:

main() {    
    float a = 9.5f;   
    printf("%d", a);    
}     

печатает 0.

Является ли вывод неопределенным? Также когда %f используется с целым числом и %d используется с двойным?

+0

выход мусор или неопределенной операция? – akash

+2

Возможный дубликат [печать значения поплавка в целочисленном виде на языке C] (http://stackoverflow.com/questions/1632080/print-the-float-value-in-integer-in-c-language) – duDE

+1

функция, которая принимает переменное количество аргументов ('printf()') без прототипа в области видимости - UB. Используйте '#include ' для правильного прототипа. – pmg

ответ

2

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

+0

Даже акт * компиляции *, этот источник вызывает UB :) – pmg

+0

@pmg Компилятор бросает носовую ошибку демона ;-) –

0

: C Стандарт говорит, что формат Printf должен соответствовать типу принятый в случае, если это не сделано, то поведение явно не определено:.

C99, 7.19.6.1 # 9 (fprintf)

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

2

Из стандартной секции C99 7.19.6.1 fprintf функции:

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

%d ожидает int, не float, так что программа имеет неопределенное поведение (в том числе и на выходе).

1

Как описано в предыдущих ответах, если формат печати не соответствует переданному типу, он показывает неопределенное поведение.

Если вы хотите просмотреть целое число как float, вам нужно его придумать.

int j = 5; 
printf("%f",(float)(j)); 

Это напечатает выход как 5.0 т.е. как число с плавающим значным