在C printf语句中,是否可以有更多的格式说明符或顺序可以与参数不同?

cdmah0mi  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(125)
#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??
参数的顺序不正确+参数是否可以少于格式说明符?

66bbxpm5

66bbxpm51#

C11标准:
如果格式的参数不足,则行为未定义。如果格式用尽而参数仍存在,则计算多余的参数(一如既往),否则忽略多余的参数。
...
如果任何参数不是对应转换规范的正确类型,则行为未定义。

  • 如果格式说明符的数量超过提供的参数的数量,则为未定义行为。
  • 如果提供了过多的参数,并且格式字符串已用尽,则参数将被简单地忽略,并且不涉及未定义的行为。
  • 顺序不应不同。第一个格式说明符必须匹配提供的第一个参数,第二个格式说明符应匹配提供的第二个参数,依此类推。如果任何参数不是相应转换规范的正确类型,则行为未定义。
hts6caw3

hts6caw32#

在C printf语句中,是否可以有更多的格式说明符或顺序可以与参数不同?
是的,你可以这样做,而且C标准没有定义你这样做时程序的行为,所以这是一个坏主意,你不应该期望它能工作。
在许多C实现中,前几个整数参数在通用处理器寄存器中传递,前几个浮点参数在浮点寄存器中传递。因此,被调用的例程将在通用寄存器中查找其整数参数(比如数字r8r9r10),并将在浮点寄存器中查找其浮点参数(比如f4f5f6)。因此,如果交换整数和浮点参数,例程仍然会在通用寄存器中查找整数参数,在浮点寄存器中查找浮点参数。例如,foo(1, 2, 3., 4.)foo(1, 3., 2, 4.)都将把整数值1和2放在用于自变量的前两个通用处理器寄存器中,并把浮点值3和4放在用于自变量的前两个浮点寄存器中。
您应该了解此行为,因为它对于调试目的和理解计算机如何工作很有用,但您不应该依赖它。当在编译器中启用优化时,高级转换可能会破坏此行为。
一些C实现确实有这样的特性,即在格式字符串中列出参数的顺序与它们在函数调用中出现的顺序不同,在每个转换规范中使用额外的字符(带有%的字符串,除了回显文字字符外,还告诉printf要做什么)。

相关问题