2016-09-17 87 views
1

当我意识到我忘记了函数中的返回语句时,我注意到了这一点,但我仍然按预期得到了该值。所以我试图在一个简单的程序中重新创建情况,并且它做了同样的事情 - 在没有显式返回语句的情况下返回期望值。C++隐式返回返回类型变量

我注意到,如果我将printf格式说明符类型从f更改为d例如,它不起作用。或者,如果我创建了一个名为double tau = 6.2830的变量,但具有返回类型的多个变量会导致返回定义的最后一个变量。

所以我的结论是,这是编译器的工作,以纠正我的错误,但这似乎没有什么帮助,我希望这是一个错误,而不是隐藏的警告,除了当使用-Wall或其他一些相关标志。

我的结论是否正确?本设计决策背后的原因是什么?

#include <stdio.h>                

float pi() {                               
    float pi = 3.1415; 
    // float tau = 6.2830; // this will now return instead 
    // double cthulhu = -000000.000000011101; // this will not allow it to work              
}                    

int main() {                  
    float num;                 
    num = pi();                 
    printf("Some number is %f", num);  // changing %f to %d will also not allow it to work          
    return 0;                 
} 

编译时

g++ test.cpp -o test 

输出

$ ./test 
Some number is 3.141500 

与-Wall标志编译器输出

a.cpp: In function ‘float pi()’: 
a.cpp:4:11: warning: unused variable ‘pi’ [-Wunused-variable] 
    float pi = 3.1415; 
      ^~ 
a.cpp:5:1: warning: no return statement in function returning non-void [-Wreturn-type] 
} 
+0

你缺少一个'return'声明可言! –

+1

TL;欺骗的DR:它是未定义的。在你的情况下,它可能恰好是拾取栈上的最后一个值或某物。 –

+0

@JasonC不幸的是,我不能用你的笨蛋重锤。由于其他原因,我一直在接近投票。我不明白为什么这个问题如此有效。 –

回答

3

您的功能没有return声明(这是compi ler警告告诉你清楚),并且没有像隐含地返回类型或变量那样的事情。你有这个函数的未定义的行为,消化它。

要解决使用类似

float pi() {                 
    return 3.1415f; 
} 

或一个简单的声明一样

constexpr float pi = 3.1415f;