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

printf("%f",(7/2));

获取未定义的行为,因为它需要浮点值,但获取整数值。
但对于像--float f=7/2;这样的赋值,默认情况下它会进行类型转换。
printf中不支持默认类型转换的原因是什么?我不是在问C规范,我是在问这种规范背后的逻辑是什么。最好有人举例说明。

最佳答案

C语言标准没有指定将printf参数转换为格式字符串中的类型,因为这需要编译器解释格式字符串,而不是让printf来执行。
一些现代编译器确实会检查printf字符串,如果它与参数不匹配,就会发出警告。但这是最近的发展。在C语言被开发的年代,编译器比现在的软件要简单得多,如果再加上要求编译器解释printf格式字符串的要求,在那时将是一个不受欢迎的负担。
此外,格式字符串不一定在编译时已知。您可以编写printf(format, a, b, c),其中format在运行时计算。显然,编译器将无法生成简单的代码来将abc转换为最终将在字符串format中的类型。当然,这在理论上是可能的;编译器可以在运行时生成大量代码来处理所有的情况。但对于一个不需要的特性来说,这将是一个过多的工作。

关于c - GCC不会在printf内部进行默认类型转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20705918/

10-16 04:44