C 在这种情况下,我想解释一下,为什么输出是10而不是20?

C 在这种情况下,我想解释一下,为什么输出是10而不是20?,c,C,我想了解为什么这段代码中的输出是10而不是20 #include<stdio.h> #include <stdio.h> int check (int, int); int main() { int c; c = check(10, 20); printf("c=%d\n", c); return 0; } int check(int i, int j) { int *p, *q; p=&i; q=&am

我想了解为什么这段代码中的输出是10而不是20

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

int check (int, int);

int main()
{
    int c;
    c = check(10, 20);
    printf("c=%d\n", c);
    return 0;
}
int check(int i, int j)
{
    int *p, *q;
    p=&i;
    q=&j;
    i>=45?*p:*q;
}
#包括
#包括
整数检查(整数,整数);
int main()
{
INTC;
c=检查(10,20);
printf(“c=%d\n”,c);
返回0;
}
整数检查(整数i,整数j)
{
int*p,*q;
p=&i;
q=&j;
i> =45?*p:*q;
}

这里的问题是check()函数的返回值是未定义的行为

为了获得
20
的预期输出,您必须像下面这样使用return语句
returni>=45?*p:*q
您需要这样做才能真正告诉编译器将结果写入返回寄存器

如果不这样做,函数将直接退出,而不显式地将结果值写入返回寄存器。相反,寄存器内容只是停留在它最后一次出现的状态(在您的案例10中),但这并不能保证,并且很可能会随着所使用的编译器的不同而有所不同


如果您真的想从教学层面上理解它,请查看以下内容:
在右边,你可以看到你的程序的x86汇编,如果你仔细看,你可以看到编译器恰好使用
eax
寄存器来比较值,这也是ABI惯例中用于函数返回值的寄存器。

check
不返回任何东西。。。这甚至不应该编译。您正在导致未定义的行为,输出可以是任何内容。如果您将最后一行更改为
return i>=45?*p:*q您将获得预期的输出。您应该在编译器中启用警告。对于GCC,您可以使用open
-Wall
完成此操作。这应该会给您一些关于“在不返回值的情况下到达非void函数的末尾”的消息。当然,阅读你的警告并处理它们。总是认为默认值应该是-wall-werror来帮助新的程序员。