相关疑难解决方法(0)

函数结尾处的空白返回语句是否必须返回返回类型?

关于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

流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.

c c++ gcc gnu g++

3
推荐指数
1
解决办法
4922
查看次数

2
推荐指数
1
解决办法
9071
查看次数

即使不执行返回,非void函数也能正常工作

我是一名计算机科学专业的大学生.昨天,我有一个关于使用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:忽略其他错误,例如当节点为空时,找不到值等.

c++ function binary-search-tree

2
推荐指数
1
解决办法
156
查看次数

传递函数参数和无返回语句

#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 function

2
推荐指数
1
解决办法
84
查看次数

在c ++和优化中缺少返回的不稳定行为

假设你用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++ return vector undefined-behavior

2
推荐指数
1
解决办法
177
查看次数

当函数在结尾处缺少return语句时,为什么它可以工作?

我正在学习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++ return function

2
推荐指数
1
解决办法
568
查看次数

为什么这种递归在C++中起作用?

我做了一个递归的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++ recursion return undefined-behavior

2
推荐指数
1
解决办法
130
查看次数

对于非 void 函数没有 return 语句,其中控制永远不会结束,这是未定义的行为吗?

我正在使用此处列出的书籍学习 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)

c++ function undefined-behavior language-lawyer c++14

2
推荐指数
1
解决办法
1039
查看次数

Visual Studio - 无法返回值时无编译错误

问题. 请参阅下面的代码...我错过了该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)

c++ visual-studio-2008

1
推荐指数
1
解决办法
316
查看次数

关于C++中复制构造函数的困惑

码:

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)

c++ reference copy-constructor c++11 c++14

1
推荐指数
1
解决办法
94
查看次数