Почему эта программа показывает предупреждение о недоступном коде? И как мне это подавить? - PullRequest
0 голосов
/ 17 сентября 2018
#include<iostream.h>
#include<conio.h>
#include<process.h>

void function(void);

int main(void)
{
 clrscr();

 int ch;

 while(1)
 {
  cin>>ch;

  if(ch==2)
    exit(0);
  else
    function();
 }//while
 return 0;
}//main

void function(void)
{
 cout<<"Hello";

 return;
}

Приведенный выше код работает нормально, но почему я получаю предупреждение "Недоступный код"? Я действительно не понимаю, что я делаю не так. Компилятор не показывает предупреждение, когда я комментирую / удаляю оператор return 0; в main(). Почему это так? Пожалуйста, скажите мне, что я делаю неправильно, и как это правильно сделать.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

почему я получаю предупреждение о "недоступном коде"? Я действительно не понимаю, что я делаю не так.

Цикл не имеет условия возврата: while(1), а тело цикла не содержит break (или goto), которое выпало бы из цикла в другом случае. Тем не менее, у вас есть оператор return 0; после цикла. Поскольку выполнение никогда не выпрыгивает из цикла, оно никогда не достигнет оператора return.

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

if(ch==2)
  break;
else
  function();

Компилятор не показывает предупреждение, когда я комментирую / удаляю return 0; утверждение в main (). Почему это так?

Это утверждение было "недостижимым кодом", на которое ссылалось предупреждение. Если нет недоступного кода, нет необходимости предупреждать об этом.

Безопасно удалить линию. main отличается тем, что неявно возвращает 0 при отсутствии оператора возврата (если выполнение когда-либо возвращается из main, чего никогда не делает ваша программа).

0 голосов
/ 17 сентября 2018

Цикл while (1) не имеет возможности выйти.

Таким образом, exit(0) не распознается, поскольку анализ потока данных не рассматривает его как возможность перейти к коду позади while (1)(и на самом деле это не так).

Следовательно, нет способа добраться до return 0;.

Если вы замените exit(0) на break, чем он изменится.break заставит покинуть while (1), и return 0; станет достижимым.

...