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


#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

然而,没有要求他们必须诊断这个。未定义行为就是未定义。一切皆有可能

最新更新