C printf()和#x27;神秘地';知道我打算打印什么吗?

C printf()和#x27;神秘地';知道我打算打印什么吗?,c,printf,C,Printf,我忘了将附带的变量添加到printf()调用中。printf()如何知道要打印的内容 int successful = 0;//Flag printf("\nEnter a number to search for: "); scanf("%d", &data); successful = search(list, data); successful? printf("\n'%d' was found\n\n", data) : printf("\n'%d' was NOT found\

我忘了将附带的变量添加到printf()调用中。printf()如何知道要打印的内容

int successful = 0;//Flag
printf("\nEnter a number to search for: ");
scanf("%d", &data);
successful = search(list, data);
successful? printf("\n'%d' was found\n\n", data) : printf("\n'%d' was NOT found\n\n");
有问题的代码是最后一行三元表达式的最后一个“else”。我已经运行了几十次,它似乎总是在输出中打印正确的参数

: printf("\n'%d' was NOT found\n\n");
怎么每次都能这样呢?

哎呀!这是“未定义的行为”

“未定义的行为”是一个技术术语,基本上意味着。。。任何事情都有可能发生。也许正确的事情会发生,也许程序会崩溃,或者它会完全做其他事情

在本例中,可能您想要的值已经在堆栈的正确位置,因此当
printf()
获取其参数时,它会得到正确的值。这在很大程度上取决于优化的使用和您正在使用的特定ABI,特别是,并非所有ABI都将值放置在堆栈上,用于非变量函数调用

successful = search(list, data);
//                        ^^^^ places "data" on stack as second argument
如果您将程序编译为64位,它可能不再工作,因为最常见的x64 ABI将寄存器用于前四个非可变参数


它不会改变您的代码错误的事实,如果您想要一致地得到正确的答案,您将需要修复它。

它可能看起来有效,但不要依赖于此

这可能是因为您最近的函数调用

successful = search(list, data);
数据
值保留在堆栈的适当位置


在这里提到,如果忽略在声明单个局部变量的函数中包含return语句,有时会出现类似的意外情况,这可能会很有用

int wowee () {
    int val;
    val = 12;

    // <-- no return statement!
}
intwowee(){
int-val;
val=12;

//未定义的行为?我只是在等待一个gcc扩展,它可以在未定义的行为上格式化开发人员的硬盘。@Thomas将
C-x m-C m-nasaldemons
足够了吗?
int wowee () {
    int val;
    val = 12;

    // <-- no return statement!
}