我想知道为什么gcc不支持printf
函数中的默认类型转换。例如:
printf("%f",(7/2));
获取未定义的行为,因为它需要浮点值,但获取整数值。
但对于像--
float f=7/2;
这样的赋值,默认情况下它会进行类型转换。在
printf
中不支持默认类型转换的原因是什么?我不是在问C规范,我是在问这种规范背后的逻辑是什么。最好有人举例说明。 最佳答案
C语言标准没有指定将printf
参数转换为格式字符串中的类型,因为这需要编译器解释格式字符串,而不是让printf来执行。
一些现代编译器确实会检查printf
字符串,如果它与参数不匹配,就会发出警告。但这是最近的发展。在C语言被开发的年代,编译器比现在的软件要简单得多,如果再加上要求编译器解释printf
格式字符串的要求,在那时将是一个不受欢迎的负担。
此外,格式字符串不一定在编译时已知。您可以编写printf(format, a, b, c)
,其中format
在运行时计算。显然,编译器将无法生成简单的代码来将a
、b
和c
转换为最终将在字符串format
中的类型。当然,这在理论上是可能的;编译器可以在运行时生成大量代码来处理所有的情况。但对于一个不需要的特性来说,这将是一个过多的工作。
关于c - GCC不会在printf内部进行默认类型转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20705918/