#include<stdio.h>
int main()
{
int a,*b,**c,***d,****e;
a=10;
b=&a;
c=&b;
d=&c;
e=&d;
printf("na=%d b=%u c=%u d=%u e=%u",a,b,c,d,e);
printf("n%d %d %d %d %d",a,a+*b,**c+***d+****e);
return 0;
}
我无法编辑这篇文章…所有这样做的选项在我的浏览器中是不可见的。我的意思是问为什么编译器没有警告我,并给我输出作为额外的格式说明符0 0。
您没有为第二次调用printf
提供足够的参数,并且调用了未定义的行为。请不要这样做。如果您正确配置了编译器的警告,则编译器应该对此发出警告,
当给定五个转换规范但只有三个参数时,您希望它打印什么?
C标准说,在7.19.6.1/2
如果没有足够的格式参数,行为是未定义的。
在你的例子中,程序碰巧打印0。在我的例子中,它打印了别的东西。
编辑回答"为什么?":大多数编译器会警告此错误:
gcc说warning: format ‘%d’ expects a matching ‘int’ argument
clang说warning: more '%' conversions than data arguments
icc表示warning #267: the format string requires additional arguments
然而,没有要求他们必须诊断这个。未定义行为就是未定义。一切皆有可能