我正在运行以下代码片段:
#includeint main() { printf("%f %d\n", 42, 3.14); }
令我惊讶的是,其中显示:
3.140000 42
编译器(基于Debian的发行版上的gcc 8.3.0)确实警告我有关参数的顺序:
test.c: In function ‘main’: test.c:3:13: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=] printf("%f %d\n", 42, 3.14); ~^ ~~ %d test.c:3:16: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘double’ [-Wformat=] printf("%f %d\n", 42, 3.14); ~^ ~~~~ %f
能比我更开明的灵魂向我解释这种行为吗?我在规范中没有发现任何可以解释的内容。
在您的计算机上,恰好发生了这样的情况,即标准调用约定规定浮点参数将传递给与整数和其他参数分开的区域中的函数。您的printf格式字符串对第一个浮点参数和第一个非浮点参数感兴趣,即使您以错误的顺序传递了它们,它也会在预期的位置找到它们。当然,这不是您应该依靠的东西;如果您为其他机器进行编译,或者对代码进行了很小的更改,它可能会停止工作。