Вопрос

Прежде всего, прежде чем я начну, я использую VC ++ 2008 professional под управлением Intel core2 в ОС Windows.Я также знаю, что этот код НИКОГДА не будет выполнен НИ на чем, кроме core2 / corei7 под управлением Windows.

У меня есть цикл while с 2 условиями, который выглядит примерно так:примечание:это значительно упрощенная версия.

while((a != b) && (array[a] < c))

Если первое условие (a != b) генерирует значение false, будет ли вообще оценено второе условие?или цикл просто завершится прямо там?

Я провел несколько тестов, и кажется, что это действительно так.

Однако вот в чем загвоздка.Когда и если первое условие принимает значение false, второе условие БУДЕТ генерировать нарушение доступа, если оно будет выполнено.Однако, из того, что я вижу, как только первое условие оценивается как false, программа не утруждает себя оценкой второго условия и завершает цикл, тем самым спасая меня.

Проблема в том, что я не могу полностью избавиться от проблемы нарушения доступа без того, чтобы мой очень приятный и аккуратный код внезапно не взорвался на мне.Однако, из-за небольшой "ошибки" (я знаю, что это оптимизация компилятора, а не ошибка), я, кажется, могу от нее избавиться.Я также знаю, что это, вероятно, не очень хорошая практика программирования, но, честно говоря, в моей ситуации, если это сработает, я уже на шаг впереди.

Мой вопрос в том, вернется ли эта "ошибка" или программная халатность когда-нибудь и укусит меня?Даже учитывая, что я чертовски тщательно протестировал этот раздел и БУДУ ИСПОЛЬЗОВАТЬ ЕГО ТОЛЬКО ОДИН РАЗ?

Это было полезно?

Решение

Второе условие не будет оценено до тех пор, пока первое не будет оценено как true.Вы можете на это рассчитывать.Миллионы строк кода работают, потому что именно так C и C ++ выполняют вычисление коротких логических выражений.

Вы можете использовать это и рассчитывать на это.Если первое выражение принимает значение false, то второе даже не начать оценивающий.

Другие советы

Это не ошибка.C ++ использует вычисление короткого замыкания, поэтому второе условие никогда не будет вычислено, если первое условие равно false.

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

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

Полагаться на short поведение логических операторов AND и OR C ++ при коротком замыкании не следует считать плохой практикой.Это совершенно идиоматично и часто приводит к более четкому и лаконичному коду.

Например.

std::auto_ptr< SomeObject > data;

С коротким замыканием &&:

// Clear expired data, if present
if( data.get() && data->expired )
    data.reset();

Без использования короткого замыкания && вам нужен дополнительный уровень if что приводит к более подробному коду.

// Clear expired data, if present
if( data.get() )
{
    if ( data->expired )
        data.reset();
}

Второе условие не будет вычислено, если первое условие не выполняется.Как вы сказали, этой оптимизации следуют все компиляторы C ++.

Если вы все еще не можете согласиться с этим, добавьте простой оператор if в while .

while ( a != b ) {
    if ( array[a] < c )
    {
         // your code goes here.
    }
    else
    {
        break;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top