这是我的测试代码,我不给函数一个返回值,但为什么这段代码可以通过编译器?我想知道我是否不将显式返回类型赋予下面的一个函数,编译器将生成什么?
这是测试代码,谢谢。
#include <iostream>
#include <vector>
using std::vector;
vector<vector<int> > testReturn(){
int test = 5;
}
int main(){
testReturn();
return 0;
}
答案 0 :(得分:1)
您不能总是信任编译器,因为不同的编译器在编译时具有不同的检查条件。如果您没有返回需要返回的函数,即使编译成功,结果仍然是未定义。这就是你的程序崩溃的原因。你应该总是尽量避免这种情况。
答案 1 :(得分:1)
这是一个错误的代码,产生undefined behavior。
这样的代码(带有返回类型的函数,没有实际的返回语句的函数)确实在某些变量中编译了一些编译器。然而,这只意味着编译器中存在一个错误,它应该发出警告/错误。
答案 2 :(得分:1)
我不给函数一个返回值,但为什么这段代码可以通过编译器?
在C中提供return
值是可选的。此规则也“迁移”到C ++,添加了一长串未定义的行为(即允许编译无效程序的情况)。对于C ++来说,编译器会以相当明确的术语警告你这样的情况。
我很想知道如果我没有给下面的一个函数提供显式返回类型,编译器会生成什么代码?
编译器不会生成任何用于处理返回值的代码。无论CPU寄存器的任意状态和闭合括号中的内存是什么,这都是“返回”的状态。试图将任意值解释为返回值是导致崩溃的原因。
答案 3 :(得分:0)
代码无法编译,因为testRunner
的返回类型是整数向量的向量。
所以回来吧!