GCC不在printf中进行默认类型转换

ali*_*der 1 c gcc type-conversion

我想知道为什么gcc不支持printf函数内部的默认类型转换.例如:

printf("%f",(7/2));
Run Code Online (Sandbox Code Playgroud)

得到未定义的行为,因为它期望浮点数但得到一个整数值.

但是在类似赋值的情况下 - float f=7/2;默认情况下它会进行类型转换.

内部不支持默认类型转换的原因是什么printf?我不是在询问C规范我在问这个规范背后的逻辑是什么.如果有人用一些例子解释会更好.

Eri*_*hil 5

C语言标准没有指定将printf参数转换为格式字符串中的类型,因为这将要求编译器解释格式字符串而不是让printf执行它.

一些现代编译器检查printf字符串并发出警告,如果它与参数不匹配.但这是最近的发展.在开发C的那些年里,编译器比现在更简单的软件,并且添加他们解释printf格式字符串的要求在那时将是一个不受欢迎的负担.

另外,格式字符串在编译时不一定是已知的.你可以写printf(format, a, b, c),format在运行时计算的位置.显然,编译器将无法生成简单的代码转换a,b以及c对各类最终将在字符串中format.当然,这在理论上是可能的; 编译器可以生成大量代码来处理运行时的所有情况.但对于不需要的功能而言,这将是一项过多的工作.