Почему ложное утверждение все еще выполняется? - PullRequest
1 голос
/ 28 августа 2011

У меня есть этот код ...

void drawMap(void)
{
    if (false)
        return;

    for(auto iter = this->m_layers.begin(); iter != m_layers.end(); ++iter)
    {
        if ((*iter)->get() == NULL)
            continue;
        PN::draw((*iter)->get(), b2Vec2(0,0), true, 0);
    }
}

Если я не ошибаюсь, он НИКОГДА не должен выполняться ... но это происходит ... и когда я меняю

    if (false)
      return;

to

    if (false)
       return;
    else
       return;

сейчас он вообще не выполняется, но как это первое утверждение НЕ может быть ложным? схватил таблетки от головной боли

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

Ответы [ 4 ]

4 голосов
/ 28 августа 2011

if (false) не будет никогда выполнять свое тело ... потому что значение условия никогда не будет истинным. Таким образом, в коде, который вы дали, остаток от drawMap будет всегда выполняться, потому что он никогда не вернется в начале.

Рассмотрим if (x == 5) - он будет выполняться только в том случае, если выражение x == 5 истинно. Теперь замените false на x == 5 ...

Если вы хотите if оператор, который будет всегда выполняться, вы хотите

if (true)

вместо.

1 голос
/ 28 августа 2011

Подсчитайте меня с толпой, которая на самом деле недостаточно хорошо читала проблему или не могла поверить, что ОП не понимает проблему, если бы она была настолько простой:)

Ответ Джона Скита, конечно, был точным: :)

Две мысли:

  1. Если вы находитесь в отладчике, могут появиться строки должен быть выполнен не по порядку, совсем не по неожиданным строкам при компиляции с оптимизацией.Это связано с тем, что некоторые машинные инструкции будут «приписываться» к различным строкам источникаКомпилировать без оптимизации, чтобы устранить источник путаницы.Это только сбивает с толку, так как оптимизация не должна (! Исключая ошибки компилятора) не изменять эффективное поведение

  2. Возможно, вы получаете зло #define для false, которому вы не можете доверять.Исключите это, запустив код только через препроцессор.g++ -E сделает это.MSVC ++ имеет возможность «сохранять предварительно обработанный» источник

Blockquote

0 голосов
/ 24 июня 2016

Я видел использование этого if (false), в коммутаторе / корпусе, подобном конструкции:

0 голосов
/ 28 августа 2011
if (false)

аналогично

if (1 == 2)

и, следовательно, никогда не выполнит следующий оператор (или блок).

В вашем контексте рассмотрите следующие комментарии, которые я сделал:

void drawMap(void)
{
    if (false) return; //Not gonna happen.

    //The following will always happen
    for(auto iter = this->m_layers.begin(); iter != m_layers.end(); ++iter)
    {
        if ((*iter)->get() == NULL)
            continue;
        PN::draw((*iter)->get(), b2Vec2(0,0), true, 0);
    }
}
...