#include <stdio.h> int main() { int a =9; float b = 1.23; double c = 6.2396734679; printf("%d %f %e",b,a); return 0; }
如何输出-〉9 1.230000 1.230000e+00??参数的顺序不正确+参数是否可以少于格式说明符?
66bbxpm51#
C11标准:如果格式的参数不足,则行为未定义。如果格式用尽而参数仍存在,则计算多余的参数(一如既往),否则忽略多余的参数。...如果任何参数不是对应转换规范的正确类型,则行为未定义。
hts6caw32#
在C printf语句中,是否可以有更多的格式说明符或顺序可以与参数不同?是的,你可以这样做,而且C标准没有定义你这样做时程序的行为,所以这是一个坏主意,你不应该期望它能工作。在许多C实现中,前几个整数参数在通用处理器寄存器中传递,前几个浮点参数在浮点寄存器中传递。因此,被调用的例程将在通用寄存器中查找其整数参数(比如数字r8、r9和r10),并将在浮点寄存器中查找其浮点参数(比如f4、f5和f6)。因此,如果交换整数和浮点参数,例程仍然会在通用寄存器中查找整数参数,在浮点寄存器中查找浮点参数。例如,foo(1, 2, 3., 4.)和foo(1, 3., 2, 4.)都将把整数值1和2放在用于自变量的前两个通用处理器寄存器中,并把浮点值3和4放在用于自变量的前两个浮点寄存器中。您应该了解此行为,因为它对于调试目的和理解计算机如何工作很有用,但您不应该依赖它。当在编译器中启用优化时,高级转换可能会破坏此行为。一些C实现确实有这样的特性,即在格式字符串中列出参数的顺序与它们在函数调用中出现的顺序不同,在每个转换规范中使用额外的字符(带有%的字符串,除了回显文字字符外,还告诉printf要做什么)。
r8
r9
r10
f4
f5
f6
foo(1, 2, 3., 4.)
foo(1, 3., 2, 4.)
%
printf
2条答案
按热度按时间66bbxpm51#
C11标准:
如果格式的参数不足,则行为未定义。如果格式用尽而参数仍存在,则计算多余的参数(一如既往),否则忽略多余的参数。
...
如果任何参数不是对应转换规范的正确类型,则行为未定义。
hts6caw32#
在C printf语句中,是否可以有更多的格式说明符或顺序可以与参数不同?
是的,你可以这样做,而且C标准没有定义你这样做时程序的行为,所以这是一个坏主意,你不应该期望它能工作。
在许多C实现中,前几个整数参数在通用处理器寄存器中传递,前几个浮点参数在浮点寄存器中传递。因此,被调用的例程将在通用寄存器中查找其整数参数(比如数字
r8
、r9
和r10
),并将在浮点寄存器中查找其浮点参数(比如f4
、f5
和f6
)。因此,如果交换整数和浮点参数,例程仍然会在通用寄存器中查找整数参数,在浮点寄存器中查找浮点参数。例如,foo(1, 2, 3., 4.)
和foo(1, 3., 2, 4.)
都将把整数值1和2放在用于自变量的前两个通用处理器寄存器中,并把浮点值3和4放在用于自变量的前两个浮点寄存器中。您应该了解此行为,因为它对于调试目的和理解计算机如何工作很有用,但您不应该依赖它。当在编译器中启用优化时,高级转换可能会破坏此行为。
一些C实现确实有这样的特性,即在格式字符串中列出参数的顺序与它们在函数调用中出现的顺序不同,在每个转换规范中使用额外的字符(带有
%
的字符串,除了回显文字字符外,还告诉printf
要做什么)。