可以使用比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
函数将尝试访问堆栈中不存在的变量,从而给出未定义的行为。
虽然你已经为printf()
提供了三个变量,但是只有两个格式说明符,所以这两个变量用前两个可用变量替换。
因为你有接受可变数量参数的函数
int printf ( const char * format, ... );
在C中,这意味着没有参数类型检查,更重要的是, printf
不知道用户传递给函数的参数。 有一个技巧 – printf
计算%
的数量,并确定它是参数的数量。 要了解它是如何工作的,您可以查看va_list
, va_start
, va_end
, va_arg
。 尝试运行printf("%i,%i,%i", a);
– 未定义的行为。