Подтвердить что ты не робот

Если.. else число меньше, чем недопустимый код

Скажем, у нас есть следующий код в C (или подобном языке):

if (x < 10)
  do_work1();
else if (x < 5)
  do_work2();

Будет ли вторая ветвь этого условного условия выполняться в некоторых случаях? Будет ли компилятор предупреждать о недостижимом коде?

4b9b3361

Ответ 1

Will the second branch of condition be executed in some case?

  • Да, это возможно, это зависит от того, что еще происходит в коде и от того, что компилятор хочет сделать с вашим кодом.

Shouldn't compiler warn about unreachable code?

  • Нет, это невозможно, потому что нет гарантии, что он недоступен

Возьмите это, например:

int x = 11;

void* change_x(){
   while(1)
      x = 3;
}

int main(void) 
{
    pthread_t cxt;
    int y = 0;
    pthread_create(&cxt, NULL, change_x, NULL);
    while(1){
        if(x < 10)
            printf("x is less than ten!\n");
        else if (x < 5){
            printf("x is less than 5!\n");
            exit(1);
        }
        else if(y == 0){    // The check for y is only in here so we don't kill
                            // ourselves reading "x is greater than 10" while waiting
                            // for the race condition
            printf("x is greater than 10!\n");
            y = 1;
        }
        x = 11;
    }

    return 0;
}

И вывод:

[email protected]:~> ./a.out 
x is greater than 10!
x is less than 5!      <-- Look, we hit the "unreachable code"

Ответ 2

  • Если x - локальная переменная, то я не вижу способа, которым мог бы выполняться do_work2.
  • Если x является глобальной переменной или разделяется между несколькими потоками, тогда может выполняться do_work2.

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

Если вам нужна дополнительная проверка, используйте внешний инструмент.

Ответ 3

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

Ответ 4

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

как

int function(){

int x;
return 0;
x=35;
}

В этом случае это даст вам предупреждение.