关于SO的大多数问题都涉及非虚假返回类型,但是我们正在就此开展一场火焰战,并希望了解社区的想法.
void DoSomething()
{
return; // Is this needed?
}
Run Code Online (Sandbox Code Playgroud)
从这个讨论中,看起来具有未定义行为的问题涉及非void返回类型的函数.void返回类型是否具有相同的未定义行为,还是仅在非void返回函数中?
我担心的是,这最终将成为一种不可靠的编码风格.但是,如果它也是void返回函数的未定义行为,那么我可以看到需要将它添加到编码标准中.如果对C和C++的答案不同,这也是可以的.
§6.6.3退货声明
2没有表达式的return语句只能用于不返回值的函数,即返回类型为void的函数,contrsuctor(12.1)或析构函数(12.4).
§6.6.3/ 2
流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.
Possible Duplicate:
Why can you return from a non-void function without returning a value without producing a compiler error?
According to the c++ standard what should be the return value of the following function.
bool done()
{
// no return value
}
Run Code Online (Sandbox Code Playgroud) 我是一名计算机科学专业的大学生.昨天,我有一个关于使用C++的二进制搜索树的课程.我们由该班的实验室助理教授.
他们将树中的节点定义为这样的结构:
struct Data{
char name[15];
int age;
Data *left,*right;
};
Run Code Online (Sandbox Code Playgroud)
他们给了我们一个在BST内搜索的代码,如下所示:
// temp is current node, name is the value of the node to be searched for.
Data* search(Data *temp,char name[]) {
if(strcmp(temp->name,name)>0)
search(temp->left,name);
else if(strcmp(temp->name,name)<0)
search(temp->right,name);
else
return temp;
}
Run Code Online (Sandbox Code Playgroud)
我注意到代码是错误的.如果函数进入第一个或第二个if块,它将不执行任何return语句.
但是当实验室助理运行代码时,它运行得很好.
我想也许这种行为是特定于编译器的.但是当我在gcc上尝试该代码时,该函数也可以正常工作.(我们大学使用microsoft visual c ++编译器)
任何人都可以解释发生了什么?为什么这段代码有效?
PS:忽略其他错误,例如当节点为空时,找不到值等.
#include<stdio.h>
int add(int,int);
main()
{
int a=2,b=3;
printf("%d %d %d",a,b,add(a,b));
getch();
}
int add(int a,int b)
{
int c;
c=a+b;
}
Run Code Online (Sandbox Code Playgroud)
好的,这给了我输出2 3 5..但是对于以下程序
#include<stdio.h>
int add(int,int);
main()
{
int a=2,b=3;
printf("%d %d %d",a,b,add(a,b));
getch();
}
int add(int a,int b)
{
int c;
c=a+b;
c=0;
}
Run Code Online (Sandbox Code Playgroud)
它仍然是2 3 5作为输出..因为我们没有return声明最终声明c=0没有初始化..它应该给,2 3 0但它只给予2 3 5.
假设你用c ++编写了一个函数,但是心不在焉地忘记输入这个单词return.在那种情况下会发生什么?我希望编译器会抱怨,或者一旦程序达到这一点,至少会出现一个分段错误.然而,实际发生的事情要糟糕得多:程序会喷出垃圾.不仅如此,实际输出还取决于优化水平!以下是一些演示此问题的代码:
#include <iostream>
#include <vector>
using namespace std;
double max_1(double n1,
double n2)
{
if(n1>n2)
n1;
else
n2;
}
int max_2(const int n1,
const int n2)
{
if(n1>n2)
n1;
else
n2;
}
size_t max_length(const vector<int>& v1,
const vector<int>& v2)
{
if(v1.size()>v2.size())
v1.size();
else
v2.size();
}
int main(void)
{
cout << max_1(3,4) << endl;
cout << max_1(4,3) << endl;
cout << max_2(3,4) << endl;
cout << max_2(4,3) << endl;
cout << max_length(vector<int>(3,1),vector<int>(4,1)) << endl;
cout << max_length(vector<int>(4,1),vector<int>(3,1)) << …Run Code Online (Sandbox Code Playgroud) 我正在学习C++.下面的代码让我困惑:
int test_return(int a)
{
for (int i = 40; i < 44; i++)
{
if (i == a)
{
cout << "return here with i: " << i << endl;
return 59;
}
}
}
int main()
{
cout << "in main: " << test_return(61) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道我在函数结束时错过了一个return语句test_return.
但编译器说没有错误,它在执行时有效.
于是,我拿起一些特殊号码,如40,44,59,61,看看哪一个函数test_return会选择回国.
我试过好几次,输出总是如下:
in main: 44
Run Code Online (Sandbox Code Playgroud)
似乎函数在for语句结束之前test_return返回了int i.
我的问题是:
这合法吗?
它是如何工作的?
更新:
我在函数末尾添加了这些代码 …
我做了一个递归的C++程序,看起来像这样:
using namespace std;
#include <iostream>
bool recursive(int num)
{
if (num == 6)
{
return false;
}
else if (num > 6)
{
return true;
}
else
{
if (recursive(num + 1))
{
return true;
}
else
{
return false;
}
}
}
int main()
{
if (recursive(0))
{
cout << "Not found!" << endl;
}
else
{
cout << "Found..." << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
它起作用,我认为这是(大致)最好的方法.
我的朋友制作了一个更简单的递归程序,如下所示:
using namespace std;
#include <iostream>
bool recursive(int num)
{
if (num == …Run Code Online (Sandbox Code Playgroud) 我正在使用此处列出的书籍学习 C++ 。特别是,我读到从非 void 函数末尾流出是未定义的行为。然后我看了这个答案,上面写着:
在 C++ 中,仅从值返回函数的末尾流出始终是未定义的行为(无论函数的结果是否由调用代码使用)。在 C 中,仅当调用代码尝试使用返回值时,才会导致未定义的行为。
但在这个答案中我读到:
在 C/C++ 下,不从声称返回某些内容的函数中返回是合法的。
正如您在第一个引用的答案中看到的,用户说在 C++ 中它始终是 UB,但第二个引用的答案说它是合法的。他们似乎互相矛盾。
上面引用的 C++ 答案中哪一个是正确的?
我还有以下 C++ 示例:
int func(int a, int b)
{
if(a > b)
{
return a;
}
else if(a < b)
{
return b;
}
}
int main()
{
int x =0, y =0;
std::cin>> x >> y;
if(x!=y)
{
func(x,y); //Question 1: IS THIS UB?
std::cout<<"max is: "<<func(x,y); //Question 2: IS THIS UB?
} …Run Code Online (Sandbox Code Playgroud) 问题.
请参阅下面的代码...我错过了该return field;语句,并没有发现它的一些调试运行.我永远不会想到这样的东西会在没有错误的情况下通过编译器!为什么呢?
描述
我有一个解析器对象,用于std::tr1::function在构造时接收转换算法.翻译从字符串转换成类型的对象TransportableMessage,它是由TMFields,可容纳不同类型的.所以无论如何我创建了一个用于创建字段的工厂函数,因为字段的类型基于一个字符串(来自XML),虽然现在只有少数几个,但未来可能会有更多.
该tstring对象是基于的类型转换,UNICODE并且基本上解析为std::wstring分钟.另外因为我使用VS2008 unique_ptr并不存在,所以我隐藏std::auto_ptr在后面ScopedPtr_t,以便更容易升级,因此更有可能发生.
namespace arc
{
namespace util
{
int internalTest()
{
std::cout << "Any error?" << std::endl;
}
ScopedPtr_T<TMField> TmFieldFactory( const tstring& name, const tstring& typeName, const tstring& value )
{
ScopedPtr_T<TMField> field;
int a = internalTest();
if( typeName == _T("int") || typeName == _T("long") )
{
field.reset( new TMNumericField( name, boost::lexical_cast<__int64>(value) ) );
}
else …Run Code Online (Sandbox Code Playgroud) 码:
class A
{
public:
A()
{
cout<<"Defualt Constructor"<<endl;
}
A(A &t)
{
cout<<"Copy Constructor"<<endl;
}
};
A func()
{
cout<<"In func"<<endl;
}
int main()
{
A a1;
A a2;
a2 = func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序工作正常.另外,如果我调用这样的函数:
A a2 = func();
Run Code Online (Sandbox Code Playgroud)
并const在复制 构造函数参数中添加限定符,如:
A(const A &t)
{
cout<<"Copy Constructor"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
还有,工作正常.
但是,如果const从复制构造函数参数中删除如:
A(A &t)
{
cout<<"Copy Constructor"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
并调用函数 func()
A a2 = func();
Run Code Online (Sandbox Code Playgroud)
编译器给出错误:
error: invalid initialization of non-const reference of …Run Code Online (Sandbox Code Playgroud)