能有一个printf语句少fomat符比变量的数目的数(can there be less numb

2019-10-19 08:06发布

为什么C编译器亘古不抛出任何错误无论是在编译时或运行time.The程序执行罚款,输出为2 4我已经在用Borland C compiler.My疑问编码后面的程序。

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

即使有少无格式说明不是参数的个数没有错误thrown.What发生在这里的。

Answer 1:

能有一个printf语句少fomat符比变量的数目的数

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

(C99,7.19.6.1p2)“如果在参数保持格式用完,多余的参数赋值(一如既往),但否则将被忽略。”



Answer 2:

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

所述printf函数是可变参数,即采用可变数目的参数。 格式字符串将决定有多少人使用,如果你指定了太多,他们将被忽略。 POSIX的参考是: http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html规定:

如果在参数保持格式用完,多余的参数应该被评估但否则将被忽略。

(底层C基准是C 2011 7.21.6.1 2从http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf -感谢@EricPostpischil -但是这是一个701页的PDF)

然而,这是由可变参数函数的工作原理相当明显。

相反(具有比你的格式说明较少变量)是不允许的作为printf函数将试图访问中不存在的栈中的变量,给未定义的行为。



Answer 3:

是。

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

“应该有至少一样多的这些参数作为在格式说明中指定的值的数目。附加参数由函数忽略。”



Answer 4:

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



Answer 5:

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

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

在C语言中,它的意思是没有参数类型检查和,甚至更多, printf不知道有多少用户参数传递给函数。 还有一招- printf计数的数量% ,并决定它的参数的数目。 要了解它是如何工作的,你可以看一下va_listva_startva_endva_arg 。 尝试运行printf("%i,%i,%i", a); - 未定义行为。



文章来源: can there be less number of fomat specifier than the number of variables in a printf statement