使用过多的参数调用 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...等。其他的直接忽略。
我想知道这是否会产生未定义的行为:
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...等。其他的直接忽略。