printf()在c打印0中用于额外的格式说明符

时间:2011-09-02 14:16:24

标签: c

#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。

2 个答案:

答案 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

但是,没有要求他们必须诊断这一点。未定义的行为就是这样,未定义。任何事情都可能发生。