printf()仍然有效,但缺少参数

时间:2016-02-01 04:28:19

标签: c

这个计划:

#include <stdio.h>
#include <conio.h>

int main()
{   

    printf("%d %d %d",1) ;
    getch();
    return 0;
}

给我结果1 0 0而不是警告错误1

你能告诉我背后的逻辑吗?

我使用Visual Studio 2010编译此代码。

3 个答案:

答案 0 :(得分:1)

这是未定义的行为,而不是您应该依赖的行为。使用printf ()时如果没有提供足够且适当匹配的参数,就像在您的情况printf("%d %d %d",1)中一样,C没有定义在这种情况下应该发生什么,因此行为不是标准的或定义的

这可能会导致程序崩溃(如果printf ()读取值的下一个内存地址无法访问或不存在)。

答案 1 :(得分:0)

printf并不关心是否有足够的参数。 “不关心”意味着它实际上并不检查格式列表中的项目数,以确保指定了足够数量的参数。

如果没有足够的参数,printf将只访问计算机内存(已使用的内存,指定了足够的参数)并使用那里的任何数据。

这是“未定义的行为”,结果会有所不同。这可能会导致您的程序崩溃(如果该位置的内存不可访问或不存在)。

你会发现这种事情在像C这样的语言中非常常见,在那里你可以做的事情应该被认为是“无效的”,但是编辑器会接受它。

答案 2 :(得分:0)

使用printf()时,如果未提供的匹配参数不足,则结果为未定义的行为。

C没有定义在这种情况下会发生什么。

  

...如果格式的参数不足,则行为为   未定义。 ......C11§7.21.6.12

OP的代码显然打印了2个额外的int,其值为0.为什么今天为0 - 查看编译的汇编语言。可能另一个代码编译具有相同的结果 - 也许 - 也许不是。它不是由语言定义的。