printf(“%d”,1.0)是否未定义?

时间:2011-07-07 21:23:17

标签: c printf glibc stdio libc

根据C89 draft的第4.9.6.1节,%d是一个字符,用于指定要应用的转化的类型。

在我看来,转换一词意味着定义了printf("%d", 1.0)

请确认或反驳此事。

4 个答案:

答案 0 :(得分:12)

转换是将语言值转换为该值的词汇表示。

你的理论是错误的;行为未定义。规范说(7.19.6.1p8和9,使用C99 TC2):

  

int 参数在样式[ - ] dddd中转换为带符号的十进制数。

并且

  

如果任何参数不是相应转换规范的正确类型,则行为未定义。

答案 1 :(得分:8)

Printf是一个varargs函数,因此无法进行转换。编译器只是安排将double推入参数列表。 Printf没有办法发现它是一个双重而不是一个int而不是一个大象。结果?混乱。

答案 2 :(得分:2)

这里的“转换”一词是指将int(这是唯一可接受的参数类型)转换为由int的十进制表示形成的字符串。它与从其他类型(例如double)到int的转换无关。

答案 3 :(得分:0)

不确定它是否正式未定义或错误 - 但这是错误的!