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

C printf(“%d”,1.0)是否未定义?,c,printf,glibc,stdio,libc,C,Printf,Glibc,Stdio,Libc,根据本手册第4.9.6.1节,%d是一个字符,用于指定要应用的转换类型 在我看来,转换一词意味着printf%d,1.0已经定义 请确认或反驳。转换是将语言值转换为该值的词汇表示形式 你的理论是错误的;行为是未定义的。规范说明7.19.6.1p8和9,使用C99 TC2: int参数将转换为样式中的带符号小数[−]dddd 及 如果任何参数不是相应转换规范的正确类型,则行为未定义 转换是将语言值转换为该值的词汇表示形式 您的理论是错误的;行为是未定义的。规范使用C99 TC2说明7.19.6.1

根据本手册第4.9.6.1节,%d是一个字符,用于指定要应用的转换类型

在我看来,转换一词意味着printf%d,1.0已经定义


请确认或反驳。

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

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

int参数将转换为样式中的带符号小数[−]dddd

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


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

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

int参数将转换为样式中的带符号小数[−]dddd

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


不确定它是正式未定义的还是错误的-但它是错误的!

不确定它是正式未定义的还是错误的-但它是错误的!

Printf是一个varargs函数,因此不可能进行转换。编译器只是安排将double推到参数列表上。Printf无法确定它是double还是int-vs大象。结果?混沌。

Printf是一个varargs函数,因此不可能进行转换。编译器只是安排将一个double推到参数列表上。Printf无法确定它是一个double与int与大象。结果?混沌。

这里的单词conversion是指int的转换,int是开启的此处可接受的参数类型是由该int的十进制表示形式组成的字符串。它与从其他类型(如double到int)的转换无关。

此处的单词conversion指的是将int(唯一可接受的参数类型)转换为由t组成的字符串该整数的十进制表示法。它与从其他类型(如double到int)的转换无关。

1.0的词法表示法[使用%d]是1,不是吗?@minitech:我不知道你的陈述是什么意思。你的第二句话正是我想要的,但它没有出现在C89草案中。你引用的是最终C89规范吗?@minitech printf转换参数,转换结果被写入标准输出。规范说s…转换规范,每个规范都会获取零个或多个后续参数,根据相应的转换说明符(如果适用)转换这些参数,然后将结果写入输出流。此转换不是在语言中的值之间转换,而是从一个值转换为一个字符序列。就像Cux::CalpICATION在C++世界中的铸造。@ Natan的C89草案,如果没有足够的参数来声明格式,行为是未定义的,或者仅仅是没有描述的描述,而不是描述行为的定义=不定义的行为,那么就可以使用这个声明。表示1.0[使用%d]是1,不是吗?@minitech:我不知道你的陈述是什么意思。你的第二句话正是我想要的,但它没有出现在C89草案中。你引用的是最终C89规范吗?@minitech printf转换参数,转换结果被写入标准输出。规范说s…转换规范,每个规范都会获取零个或多个后续参数,根据相应的转换说明符(如果适用)转换这些参数,然后将结果写入输出流。此转换不是在语言中的值之间转换,而是从一个值转换为一个字符序列。就像Cux::CalpICATION在C++世界中的铸造。@ C89草案中的Natan,如果没有足够的参数用于该格式,行为是未定义的,或者仅仅是没有描述的描述,而不需要描述行为=忽略未定义的行为。指定从int的转换。除非您没有传递int。对,'%d'指定从int的转换。除非您没有传递int。