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

Jab*_*cky 20 c printf language-lawyer

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

printf("Test %d %s", 123, "abc", "def", "ghi");
Run Code Online (Sandbox Code Playgroud)

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

恕我直言printf()应该忽略这些多余的论点,而且应该没有UB.它是否正确?

Sou*_*osh 32

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

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

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

  • @JulesMazur除了Quentin的观点之外,在传递给函数之前总是会对参数进行求值.在这方面使printf变得特别,这将使我们的生活变得更加复杂. (6认同)
  • +1,我不知道它是明确定义的.BTW"not UB"可以被优化,"not"和"un"抵消,仍然是"定义的行为". (3认同)
  • @JulesMazur不评估参数意味着`printf("%d",++ i);`会增加`i`,而`printf("foo",++ i);`则不会.这几乎没有任何意义,令人难以置信的模糊.因此,"一如既往",在传入之前对参数进行求值,然后由函数忽略. (3认同)
  • @JensGustedt - 术语"未定义的行为"由标准定义; "定义的行为"一词不是.所以正确的短语确实是"不是未定义的行为". (3认同)