2011-01-10 183 views
15

为什么下面的代码有正确的输出? int GGT没有返回语句,但代码仍然工作?没有设置全局变量。函数返回值无返回语句

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

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; 
     } 
    } 
} 
+6

打开警戒线直到你的编译器,你应该得到一个消息... – 2011-01-10 08:30:32

+0

我收到一条警告消息,但我interessted为什么它的工作,该编译器设置了一个返回值,如果那里没人? – 2011-01-10 08:32:53

+1

[C函数定义为int,但在主体中没有return语句的可能重复仍然编译](http://stackoverflow.com/questions/4260048/c-function-defined-as-int-but-having-no- return-statement-in-the-body-still-compi) – 2015-05-13 07:04:24

回答

27

对于x86至少,该函数的返回值应该是eax寄存器。任何在那里的东西都会被认为是来电者的返回值。

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

11

它不应该工作,当然不上所有的编译器和目标OS工作,即使它适用于你的。

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

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

我用gcc测试它:

GCC没有优化: 输入端10,20 - >结果是10个

GCC -O1 输入端10,20 - >结果是1个

GCC -02 输入10,20 - >结果是0

+1

可能downvoter解释他相信或不喜欢什么? – kriss 2011-01-10 09:03:23

-3

你不需要return语句,如果您正在使用指针。一般来说,你只能通过Return语句返回一个值,但是如果你使用指针,你可以返回你想要的数量。

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

+0

不要这么想,如果我使用指针 – 2011-01-10 08:37:06

3

在x86返回值被存储在EAX寄存器,“不小心”也被该编译器以存储算术运算(或至少减法)的结果。你可以通过查看编译器生成的程序集来检查它。我同意克里斯 - 你不能认为这将永远是这种情况,所以最好明确指定返回值。

0

GCC糊剂“RET”指令在这种情况下,当在运行时铛糊剂“UD2”和应用程序崩溃。