我想知道这是否会产生未定义的行为:
printf("Test %d %s", 123, "abc", "def", "ghi");
格式字符串与格式字符串匹配后的前两个参数,所以这些都可以;但第3和第4个参数过多,因为没有更多相应的格式说明符。
恕我直言printf()
应该忽略这些多余的论点,而且应该没有UB。这是对的吗?
答案 0 :(得分:32)
是的,此方案由标准明确定义。它是不未定义的行为。
引用C11
标准,章节§7.21.6.1, fprintf()
函数
[...]如果参数保留时格式已用尽,评估多余参数(一如既往),否则将被忽略 [...] < / p>
答案 1 :(得分:3)
基本上,printf(或任何格式化功能)只会查看&#39; n&#39;来自变量列表参数的格式字符串中的%d,%c,%f ...等的数量。其他人被忽略了。