#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。
答案 0 :(得分:5)
您没有为第二次调用printf
提供足够的参数,并调用了未定义的行为。请不要这样做。如果你适当地配置它的警告,你的编译器应该警告这个,
答案 1 :(得分:3)
如果给出五个转换规范但只有三个参数,您希望它打印什么?
C标准在7.19.6.1/2
如果格式的参数不足,则行为未定义。
在你的情况下,程序发生打印零。在我的情况下,它打印了别的东西。
编辑回答“为什么?”的问题:大多数编译器都会对此错误发出警告:
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
但是,没有要求他们必须诊断这一点。未定义的行为就是这样,未定义。任何事情都可能发生。