可以使用比printf语句中的变量数更少的fomat说明符

我在borland c编译器中编写了以下程序。我怀疑为什么c编译器在编译时或运行时都不会抛出任何错误。程序执行正常,输出为2 4。

#include #include int main(){ int a=2,b=4,c=6; printf("%d%d",a,b,c); getch(); return 0; } 

尽管格式说明符的数量少于参数的数量,但没有抛出错误。这里发生了什么。

可以使用比printf语句中的变量数更少的fomat说明符

答案是肯定的。 从C标准:

(c99,7.19.6.1p2)“如果参数保留时格式已用尽,则会过多地评估多余的参数(一如既往),否则将被忽略。”

这将工作正常但如果您的编译器设置为检查printf varargs参数可能会给编译器错误。

printf函数是可变参数,即获取可变数量的参数。 格式字符串将指示使用的数量,如果指定的太多,它们将被忽略。 POSIX参考是: http : //pubs.opengroup.org/onlinepubs/009695399/functions/printf.html ,其中指出:

如果参数保留时格式已用尽,则应评估多余的参数,否则将忽略这些参数。

(基础C参考文献是来自http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf的 C 2011 7.21.6.1 2 – 感谢@EricPostpischil – 但这是一个701页PDF)

然而,从可变函数的工作原理来看,这是显而易见的。

不允许相反(具有比格式说明符更少的变量),因为printf函数将尝试访问堆栈中不存在的变量,从而给出未定义的行为。

是。

http://www.cplusplus.com/reference/cstdio/printf/

“这些参数应该至少与格式说明符中指定的值的数量一样多。函数会忽略其他参数。”

虽然你已经为printf()提供了三个变量,但是只有两个格式说明符,所以这两个变量用前两个可用变量替换。

因为你有接受可变数量参数的函数

int printf ( const char * format, ... );

在C中,这意味着没有参数类型检查,更重要的是, printf不知道用户传递给函数的参数。 有一个技巧 – printf计算%的数量,并确定它是参数的数量。 要了解它是如何工作的,您可以查看va_listva_startva_endva_arg 。 尝试运行printf("%i,%i,%i", a); – 未定义的行为。