返回内部循环C ++中断循环?

时间:2016-02-11 09:43:17

标签: c++

我正在扭转双重链表。我的功能是:

Node* Reverse(Node* head)
{
    // Complete this function
    // Do not write the main method. 
    Node* temp = new Node();
    if ( head == NULL) { return head; }
    while ( head != NULL) {
        temp = head->next;
        head->next = head->prev;
        head->prev = temp;
        if (temp == NULL ) { break; }
        head = temp;
    }
    return head;
}

这可以正常工作。 而不是使用break命令,如果我'返回head'而不是函数退出while循环并且有编译错误:控制到达非void函数的结尾[-Werror = return-type]

Node* Reverse(Node* head)
{
    // Complete this function
    // Do not write the main method. 
    Node* temp = new Node();
    if ( head == NULL) { return head; }
    while ( head != NULL) {
        temp = head->next;
        head->next = head->prev;
        head->prev = temp;
        if (temp == NULL ) { return head; }
        head = temp;
    }
 }

这背后的原因是什么?

2 个答案:

答案 0 :(得分:4)

原因是编译器不知道temp总是在某个时刻最终成为NULL,它只知道循环可以结束,并且函数将没有return语句。

正如 CompuChip 指出的那样,您可以在最后添加以下行,以安抚编译器:

throw std::runtime_error("Control should never reach this point");

或者您最后可以返回NULL

答案 1 :(得分:1)

你所知道的,但编译器不知道,条件temp == NULLhead != NULL变为假之前是真的。它假定while循环可能自然结束(使用head == NULL),因此缺少return语句。

while循环条件更改为1(true)可能会解决警告问题。 (毕竟这是一个警告,并不是真正的错误;因为你要求它使用-Werror),它会变成错误。

更好的做法是尽可能避免改变控制流量(尽可能避免break)。这使代码更容易理解其他人和编译器:

Node* Reverse(Node* head)
{
    if (head == NULL) { return head; }
    Node* temp = head->next;
    while (temp != NULL) {
        head->next = head->prev;
        head->prev = temp;
        head = temp;
        temp = head->next;
    }
    return head;
 }