函数返回没有return语句的值

为什么下面的代码输出正确? int GGT没有return语句,但代码确实有用吗? 没有设置全局变量。

#include  #include  int GGT(int, int); void main() { int x1, x2; printf("Bitte geben Sie zwei Zahlen ein: \n"); scanf("%d", &x1); scanf("%d", &x2); printf("GGT ist: %d\n", GGT(x1, x2)); system("Pause"); } int GGT(int x1, int x2) { while(x1 != x2) { if(x1 > x2) { /*return*/ x1 = x1 - x2; } else { /*return*/ x2 = x2 - x1; } } } 

至少对于x86,此函数的返回值应该在eax寄存器中。 那里的任何东西都会被调用者视为返回值。

因为eax用作返回寄存器,所以它通常被callee用作“scratch”寄存器,因为它不需要保留。 这意味着它很可能被用作任何局部变量。 因为它们两者在最后是相等的,所以更有可能将正确的值保留在eax

它应该不起作用,当然不适用于所有编译器和目标操作系统,即使它适用于您的。

可能的解释是返回int的函数总是返回一些东西,它通常是寄存器的内容。 可能会发生用于返回值的寄存器在您的情况下与用于在从函数返回之前计算最后一个表达式相同(在x86目标上,当然是eax)。

这就是说,允许检测到没有返回的优化编译器完全删除该函数的代码。 此后,您在激活更高优化级别时看到(可能)消失的效果。

我用gcc测试了它:

没有优化的gcc:输入10,20 – >结果是10

gcc -O1输入10,20 – >结果为1

gcc -O2输入10,20 – >结果为0

在x86上,返回值存储在EAX寄存器中,该编译器也“意外地”使用它来存储算术运算的结果(或至少减法)。 您可以通过查看编译器生成的程序集来检查这一点。 我同意kriss – 你不能认为这种情况总是如此,所以最好明确指定返回值。

在这种情况下,GCC粘贴“ret”指令,而clang粘贴“ud2”并且应用程序在运行时崩溃。

如果使用指针,则不需要return语句。 通常,您只能通过Return语句返回一个值,但如果您使用指针,则可以返回您想要的数量。

scanf(“%d”,&x1); 在那里你给function一个X1的地址,而不是X1值。 指针工作宽度地址。 你可以阅读书籍,学习如何使用指针。