2016-02-11 3 views
2

Я реверсирую двойной список. Моя функция для этого же:Возврат внутрь цикла для цикла C++ breaks?

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; 
} 

Это работает правильно. Вместо того, чтобы использовать команду останова, если я «возвратный голову», чем функция выходит из цикла пока так и ошибку компиляции: управление достигает конца Непустой функции [-Werror = возвратного типа]

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; 
    } 
} 

Что может быть причиной этого?

+0

Можете ли вы опубликовать сообщение об ошибке компилятора? – ul90

+1

Я думаю, это потому, что все пути кода должны возвращать узел *. Это может никогда не произойти во время выполнения, но по-прежнему существует путь после цикла while. –

+0

ошибка: управление достигает конца не-void функции [-Werror = return-type] –

ответ

4

Причина в том, что компилятор не знает, что temp всегда будет NULL в какой-то момент, он знает, что цикл может закончиться, и функция не будет иметь оператора возврата.

Как CompuChip отметил, вы можете добавить следующую строку в конце, чтобы успокоить компилятор:

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

Или вы можете просто вернуть NULL в конце.

+3

И возможное исправление: добавить 'throw std :: runtime_error (« Control никогда не должен доходить до этой точки »);' прямо перед закрывающей скобкой. – CompuChip

+0

@CompuChip, мне это нравится, но это не сработает для заблудших душ, которые отключили поддержку исключений (это реальная вещь, с которой я не согласен, но я отвлекаюсь). – StoryTeller

+0

true, но я не ожидаю этого от кого-то, кто использует '-Werror' :) – CompuChip

1

Что вы знаете, но компилятор не знает, что условие temp == NULL будет истинным до того, как head != NULL станет ложным. Предполагается, что цикл while может закончиться естественным образом (с head == NULL), и поэтому оператор возврата отсутствует.

Изменение состояния while на 1 (правда), вероятно, устранит предупреждение. (Это предупреждение в конце концов, на самом деле не ошибка, это становится ошибкой, потому что вы попросили его использовать -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; 
} 
+0

Жесткая ошибка с правильными флагами компиляции (и это тоже хорошо). Лучше оставить его на уровне ошибки. – StoryTeller

+0

@StoryTeller Я не считаю это хорошей вещью, когда ложноположительное предупреждение становится ошибкой. – davmac

+0

Это ошибка, указывающая на неправильную практику кодирования. У меня было несчастье исправить загадочные ошибки, которые может вызвать код при вводе изменений. – StoryTeller

Смежные вопросы