使用过多的参数调用 printf 是未定义的行为吗?

Is calling printf with excess arguments undefined behaviour?

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

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

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

恕我直言 printf() 应该简单地忽略这些多余的参数并且不应该有 UB。这是正确的吗?

是的,这个场景是标准明确定义的。这是不是未定义的行为。

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

[...] If the format is exhausted while arguments remain, the excess arguments are evaluated (as always) but are otherwise ignored [...]

基本上,printf(或任何格式化函数)将仅查看变量列表参数中格式字符串中的 'n' 个 %d、%c、%f...等。其他的直接忽略。