调用printf有多余的参数未定义的行为?

时间:2015-07-22 09:26:30

标签: c printf language-lawyer

我想知道这是否会产生未定义的行为:

printf("Test %d %s", 123, "abc", "def", "ghi");

格式字符串与格式字符串匹配后的前两个参数,所以这些都可以;但第3和第4个参数过多,因为没有更多相应的格式说明符。

恕我直言printf()应该忽略这些多余的论点,而且应该没有UB。这是对的吗?

2 个答案:

答案 0 :(得分:32)

是的,此方案由标准明确定义。它是未定义的行为。

引用C11标准,章节§7.21.6.1, fprintf()函数

  

[...]如果参数保留时格式已用尽,评估多余参数(一如既往),否则将被忽略 [...] < / p>

答案 1 :(得分:3)

基本上,printf(或任何格式化功能)只会查看&#39; n&#39;来自变量列表参数的格式字符串中的%d,%c,%f ...等的数量。其他人被忽略了。