声明有返回值的函数必须return吗???

时间:2022-09-01 23:17:36
如果一个函数声明如下:
int funca(int i)
{
   return i;
}
毫无疑问是必须显示的return返回,并带一个int类的值

但是如果函数为
int* funcb(int i)呢??
如果
int* funcb(int i)
{}
这样编译器会报错,必须要返回一个int*
然而如果这样
int* funcb(int i)
{
    if(i > 0)
    {
       return new int(0);
     }
}
编译居然可以通过了,为什么,如果我的i<0,那么我什么都没有return啊
跟踪汇编代码也没有发现这条路径上有任何的设置eax的动作,搞不懂啊

6 个解决方案

#1


会有警告:不是所有路径都有返回值

#2


那条不return的路径其实感觉和
int* funcb(int i)
{}
是一回事啊
那为什么一个是error,一个是warning??

#3


你的3个函数编译在G++下都是可以通过的,不同的编译器有不同的检验程度。

#4


引用 3 楼  的回复:
你的3个函数编译在G++下都是可以通过的,不同的编译器有不同的检验程度。


谢谢,没有试过c++,只用了VS来尝试,还以为是标准的问题呢

#5


我的拙见,
函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),
函数中没有return,只是没有给这个寄存器存入合法的值。
出栈后还是会去读寄存器,只是读来来的是垃圾数据。
高手莫笑。。

#6


int main不需要

其他的都需要,否则会有警告。

#1


会有警告:不是所有路径都有返回值

#2


那条不return的路径其实感觉和
int* funcb(int i)
{}
是一回事啊
那为什么一个是error,一个是warning??

#3


你的3个函数编译在G++下都是可以通过的,不同的编译器有不同的检验程度。

#4


引用 3 楼  的回复:
你的3个函数编译在G++下都是可以通过的,不同的编译器有不同的检验程度。


谢谢,没有试过c++,只用了VS来尝试,还以为是标准的问题呢

#5


我的拙见,
函数声明时的返回类型指明,函数出栈后要去寄存器中取值(取出来的是return值的地址),
函数中没有return,只是没有给这个寄存器存入合法的值。
出栈后还是会去读寄存器,只是读来来的是垃圾数据。
高手莫笑。。

#6


int main不需要

其他的都需要,否则会有警告。