为什么允许多变量返回语句?

Nau*_*ile 1 c++

简单地说,为什么以下代码编译?

#include<iostream>

int foo(){
    return 0,1;
}

int main(){
    int a,b = foo();
    std::cout << a << " " << b << std::endl;
    std::cout << foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用64位Window的机器,并使用Dev-C++进行编译(使用MinGW GCC 4.5.2 32位编译器).

此代码打印以下输出:

2686824 1
1
Run Code Online (Sandbox Code Playgroud)

我强烈怀疑包含的值a是存储在未初始化变量中的通常垃圾.

这个问题中可以清楚地看出,从函数中返回多个值并不是工业中常见的做法,并且在学术机构教授的编程课程中肯定会受到劝阻和惩罚.

那它为什么有效呢?由于我已经成熟为程序员,我已经意识到编译器错误的难以置信的价值,它比链接器或运行时错误更容易理解,并且显然比错误更好.

为了清楚起见,我更感兴趣的是为什么从语言设计的角度来看这是允许的,而不是编译器如何做其事情的技术细节(除非,在这种情况下,实现现实或技术后果使其变得困难/无法检测/管理多个return变量).

是否有一些深奥的案例,其中多变量return法令被认为是有用的?

Bau*_*gen 16

你仍然只返回一个值,即1.

return 0,1;
Run Code Online (Sandbox Code Playgroud)

使用逗号运算符,其结果是右侧.使用正确的警告级别,您的编译器(至少gcc和clang)将发出警告,因为它的左侧没有效果.

如果您确实想要返回多个值,则可以返回std::tuple(或std::pair):

auto fun () {
    return std::make_tuple(0,1);
}

int main () {
    int a, b;
    std::tie(a,b) = fun();
    // Now a == 0, b == 1
}
Run Code Online (Sandbox Code Playgroud)

从C++ 17开始的等效替代:

auto fun () {
    return std::make_tuple(0,1);
}

int main () {
    auto [a,b] = fun();
}
Run Code Online (Sandbox Code Playgroud)

生活