【问题标题】:Object returned without return keyword没有返回关键字的对象返回
【发布时间】:2018-10-18 20:31:00
【问题描述】:

我正在尝试一些东西,我做了这个代码:http://cpp.sh/4x435 (如下图所示)

#include <iostream>

using namespace std;

class Thing{
    public:
        int height;
        Thing(int h): height(h) {};
        Thing(): height(10) {};
        ~Thing(){};

        int display(){ return this->height; }
};

Thing* get(){
    Thing* x = new Thing(33);
}

int main(){
    Thing* a = new Thing();
    std::cout<<"1: "<<a->display()<<std::endl;
    a = get();
    std::cout<<"2: "<<a->display()<<std::endl;
    return 0;
}

在编译和运行它之前,我忘记在“get”函数中添加一个返回值,令人惊讶的是它无论如何都正确播放(即“1:10, 2:33”是输出)。

现在我看到在线 shell 中它只显示“1:10”,而当我尝试让它按值返回一个 int 或字符串时,如下所示:

int get(){ int a = 30; }

int main(){
    int b = get();
    std::cout<<"1: "<<b<<std::endl;
    return 0;
}

它不能正常工作(输出“1:1”),这是意料之中的。

那里发生了什么? “Things* get()”不应该出现故障、导致错误或至少让它在屏幕上吐出一些乱码之类的东西吗?

我正在使用 Code::Blocks 16.01、C++11、GNU GCC 编译器,没有设置额外的标志(所以只有 Code::Blocks 已经设置的标志)

编辑:

这与建议的重复不完全相同,因为int get() { int a = 30; } 的示例返回 1,如果它返回 30,那么就会出现同样的问题。

但是,我尝试了这个:

int* get(){
    int* x = new int(4);
}
int main(){
    int* a;
    a = get();
    std::cout<<"2: "<<*a<<std::endl;
    return 0;
}

在这里,我遇到了在尝试get() 的返回类型为Thing* 的代码的第一个版本时发现的相同问题。所以它似乎与指针有关。

【问题讨论】:

  • 为什么 get() 函数不返回任何东西?
  • @Abra001 OP 已经在问题中解决了这个问题:“我在编译和运行它之前忘记在“get”函数中添加一个返回值”。被问到的问题是为什么编译器或运行时没有捕获到这个错误(被遗忘,即省略返回)
  • @Mgetz 不完全是。我在“它无法正常运行(输出“1:1”)中解释了这种情况,这是意料之中的。”,我认为这是缺少重要关键字的逻辑结果,即它在输出中向我展示了一些东西,所以我可以看到它没有做我想要的。但是如果“int get()”返回 30,那么这将是同样的问题。 “Thing”对象无论如何都返回了正确的结果,这让我感到惊讶。
  • @JackOfBlades 它返回的东西恰好是您认为正确的东西,但也很容易成为您认为不正确的东西。输出完全不足为奇,但事实上您碰巧认为它是正确的。如果你不再认为它是正确的,那么谜团就会消失。鉴于您提供的代码,该实现做了一些您不会期望的事情——这正是您应该期望的。

标签: pointers return codeblocks


【解决方案1】:

在编译时使用-Wall 选项以获得适当的警告,例如:

gcc program.c -o program -Wall

否则,这个问题及其接受的答案解释了它发生的原因,甚至提供了一个与您的观察类似的示例:

Why does flowing off the end of a non-void function without returning a value not produce a compiler error?

如果您好奇,请检查汇编程序输出!您可以通过以下方式生成它:

gcc program.c -S

由于行为未定义,任何事情都可能发生,您遇到的问题很可能是由于函数内部,编译器在通常用于返回的寄存器中留下了正确的值。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2016-07-25
    • 2021-11-27
    • 2012-09-12
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多