关于c++中函数的返回值
2013-01-20 15:00
169 查看
自己写了一点代码,发现了一个有趣的现象,函数没有显式地返回一个返回值,结果却能够返回一个值,而且结果还是正确的。
代码贴下:
效果图:
请教了一个学得久的同学,他查阅了C++标准(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2960.pdf,
6.6.3 The return statement),解释了这一现象:如果存在一定合法的执行顺序导致函数退出时没有指定返回值,则函数返回值的行为未定义;行为未定义的意思是说,它不对你这样做后产生的效果做任何保证。所以那样只是碰巧而已,且是非常危险的,因为在不同的C++编译器下的效果可能就不一样的。
而这种情况很有可能因为写程序时的不小心出现,而且一旦发生错误很难排查,所以他建议我在编译时加上-Wall和-Wextra参数。一旦出现包含以上及更多的可能的问题(比如函数有返回值,但是没有使用),编译器会在编译时输出警告信息。
比如:
g++ a.cpp -o a.exe -Wall -Wextra
效果如图:
这是一个非常好的建议,在此对这位同学表示感谢~
代码贴下:
#include <iostream> using namespace std; template <class T> int BinSearch (T * E, T e, int lo, int hi) //[lo, hi) { while (lo < hi) { int mi = (lo + hi) >> 1; (e < E[mi]) ? hi = mi : lo = mi + 1; } //出口时,lo = hi且指向大于e的元素的最小秩 return lo - 1; //返回值就是不大于e的元素的最大秩 } int _elem[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; template <class T> int search (T e) { BinSearch(_elem, e, 0, 10); } int main() { cout << search(5); system("pause"); return 0; }
效果图:
请教了一个学得久的同学,他查阅了C++标准(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2960.pdf,
6.6.3 The return statement),解释了这一现象:如果存在一定合法的执行顺序导致函数退出时没有指定返回值,则函数返回值的行为未定义;行为未定义的意思是说,它不对你这样做后产生的效果做任何保证。所以那样只是碰巧而已,且是非常危险的,因为在不同的C++编译器下的效果可能就不一样的。
而这种情况很有可能因为写程序时的不小心出现,而且一旦发生错误很难排查,所以他建议我在编译时加上-Wall和-Wextra参数。一旦出现包含以上及更多的可能的问题(比如函数有返回值,但是没有使用),编译器会在编译时输出警告信息。
比如:
g++ a.cpp -o a.exe -Wall -Wextra
效果如图:
这是一个非常好的建议,在此对这位同学表示感谢~
相关文章推荐
- 关于C++对函数传参与函数返回值进行引用传递的详解
- 【语言-C++】关于CString 函数GetLength()返回值等于0
- 关于单链表插入函数设计问题/c&c++/code/
- 关于C和C++中函数调用时的形参和实参
- 关于C++中虚函数表存放位置的思考
- 关于C++ map容器的使用和pair类型及函数
- 关于C++中的虚函数
- 关于函数返回值是指针的问题
- 对C++中对象作为函数返回值时系统自动调用拷贝构造函数的理解
- 关于C++一些常用函数的说明(scanf,fabs,abs)
- c++中关于数组作为函数参数的几种方法
- 关于C++编写可变参数的函数
- 【C++总结】关于函数返回对象析构的问题
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中虚函数表存放位置的思考
- 堆排序——C++关于堆排序的库函数排序
- 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
- C++中关于函数的extern链接性以及extern关键字
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- 关于C++中函数指针的使用(包含对typedef用法的讨论)