为什么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发生在这里的。
为什么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发生在这里的。
能有一个printf语句少fomat符比变量的数目的数
答案是肯定的。 从C标准:
(C99,7.19.6.1p2)“如果在参数保持格式用完,多余的参数赋值(一如既往),但否则将被忽略。”
这将正常工作,但如果你的编译器设置为检查可能会给一个编译器错误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
函数将试图访问中不存在的栈中的变量,给未定义的行为。
是。
http://www.cplusplus.com/reference/cstdio/printf/
“应该有至少一样多的这些参数作为在格式说明中指定的值的数目。附加参数由函数忽略。”
虽然你已经提供了三个变量来printf()
但只有两个格式说明都是存在的,所以这两个是与前两个可用的变量替换。
因为你有函数接受可变数量的参数
int printf ( const char * format, ... );
在C语言中,它的意思是没有参数类型检查和,甚至更多, printf
不知道有多少用户参数传递给函数。 还有一招- printf
计数的数量%
,并决定它的参数的数目。 要了解它是如何工作的,你可以看一下va_list
, va_start
, va_end
, va_arg
。 尝试运行printf("%i,%i,%i", a);
- 未定义行为。