2013-07-28 2 views
-8
# include <stdio.h> 

int main() 
{ 
int a=4; 
printf("%f",a); 
} 

ВыходПочему выход программы так?

0.000000 

Также

# include <stdio.h> 

int main() 
{ 
float a=4.5; 
printf("%d",a); 
} 

Выход

0 

Может кто-нибудь объяснить поведение вышеуказанных результатов? Я знаю, что использование другой спецификации coversion глупо, но я просто прошу теоретической цели.

+2

[** Неожиданный выход из Е() **] (HTTP: // StackOverflow .com/questions/17898186/unexpected-output-of-printf/17898217 # 17898217) - 'если тип несовместим с типом фактического следующего аргумента (в соответствии с продвижением по умолчанию),' ** ' поведение не определено' ** –

ответ

2

Может ли кто-нибудь объяснить поведение вышеназванных выходов?

Это неопределенное поведение.

(C11, 7.1.4p1) «Если аргумент функции имеет [...] или тип (после продвижения) не ожидается функции с переменным числом аргументов, поведение не определено»

ради истории, есть дефект отчет C (DR # 83), который адресует это точно такой же вопрос:

http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html

+0

Возможно, вы захотите уточнить, что этот отчет о дефектах относится к самому стандарту, а не к языку. Стандарт не сказал (на тот момент), что он не определен. – paxdiablo

0

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

Вещи более интересным, так как тип из аргументов по умолчанию повышен: short/char ->int, float ->double.

Ваши примеры - неопределенное поведение, поэтому вы можете получить что угодно, но то, что, вероятно, происходит под капотом, состоит в том, что байты, содержащие фактический аргумент, интерпретируются так, как если бы они имели тип, указанный в строковом формате. Обратите внимание, что float повышен до double и %f указан спецификатор также double, которая, вероятно, 8 байт, в то время как int, вероятно, 4 байта ...

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