2015-04-08 3 views
1
bool Order::add(std::istream& is){ 
    int copies; 
    bool keepgoing = true; 

    while (keepgoing){ 
     std::cout << "Quantity (0 to quit) : "; 
     is >> copies; 
     if (copies==0){ 
     keepgoing = false; 
     return false; 

     }else if (copies<0){ 
     std::cout << "Enter a positive number. Try again."<<std::endl; 
     }else{ 
     no_copies+=copies; 
     return true; 
     } 
    } 
} 

Он показывает предупреждение о том, что элемент управления может достигать конца не-пустоты. Не понимаю.Как избавиться от этих предупреждений?

+0

Правильный отступ пожалуйста. – Borgleader

+2

Если элемент управления попадает в часть 'else if', нет' return', следовательно, это предупреждение. –

+0

@karma_geek Это внутри цикла while, который будет продолжаться и в этом случае. – hvd

ответ

3

Весь keepgoing бизнес является избыточным — вы только когда-либо устанавливали его в false как раз перед выходом из функции в любом случае. Заменить его с петлей «навсегда» и предупреждение должно исчезнуть:

bool Order::add(std::istream& is){ 
    int copies; 

    for(;;) { 
     std::cout << "Quantity (0 to quit) : "; 
     is >> copies; 
     if (copies==0){ 
     return false; 
     }else if (copies<0){ 
     std::cout << "Enter a positive number. Try again."<<std::endl; 
     }else{ 
     no_copies+=copies; 
     return true; 
     } 
    } 
} 

Обратите внимание, что вы не проверяя, что ввод удалось, что вы всегда должны.

+0

Кроме того, for (;;) более эффективен, чем while (true). – szulak

+3

@szulak Действительно? Я не считаю, что * любой компилятор, заслуживающий своей соли, производит разные коды для этих двух. – Angew

+2

@szulak Если это так, выбросьте компилятор из окна. –

2

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

Вы добавили переменную keepgoing, которая ничего не добавляет. Во всех случаях, когда вы осмысленно используете свое значение, его значение будет true. Тем не менее, компилятор не может определить, что он всегда будет true во всех соответствующих случаях и учитывает, что он неожиданно получает значение false. Кто знает, может быть, ваш компилятор поддерживает вас, изменяя переменную с помощью отладчика.

Как уже отмечалось, вы можете легко избавиться от этой переменной: ваше return заявление вызовет цикл while быть вышел, независимо от состояния этого while передачи контура в.

0

return Переместить заявление после

 keepgoing = false; 

до конца.

 return false; 

Как:

bool Order::add(std::istream& is){ 
    int copies; 
    bool keepgoing = true; 

    while (keepgoing){ 
     std::cout << "Quantity (0 to quit) : "; 
     is >> copies; 
     if (copies==0){ 
     keepgoing = false; 
     // No need to return from here. 
     // Changing keepgoing to false will break the loop. 
     }else if (copies<0){ 
     std::cout << "Enter a positive number. Try again."<<std::endl; 
     }else{ 
     no_copies+=copies; 
     return true; 
     } 
    } 

    return false; 
} 
0

Похоже, компилятор не очень понятно, на его предупреждения. Предупреждение пытается сказать, что если ваша функция подходит к концу, вы не возвращаете никакого значения. Поскольку ваш цикл while может выйти, вы проверяете переменную bool, а не просто говорите while (true) - компилятор сообщает вам, что не все пути через ваш код возвращают значение, что плохо.

Многие компиляторы будут обрабатывать while (true) как собственные предупреждения, так как они могут легко привести к бесконечным циклам. Код без предупреждения, переместить строку

return false 

оттуда у вас есть до самого конца функции. Таким образом, когда пользователь вводит 0, переменная keepgoing разрывает цикл while и падает до конца функции, возвращая false.

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