简单地说,为什么以下代码编译?
#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)
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |