2009-07-10 2 views
6

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

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

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

Если первое условие (a != b) создает ложное, будет второе условие даже быть оценена? или цикл просто прекратится прямо там?

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

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

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

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

+0

Ничего себе, у вас много вопросов, не так ли? Вы должны просто добавить моего посыльного haha ​​ –

+0

Вы снова! Я сообщу вам о MM и дам вам своего посланника. Чувак, вроде 3AM, где вы! ты не спишь? Вам просто нравится ... жить здесь? (Я только опаздываю, потому что это единственный раз, когда все остальные спят и не беспокоят меня, поэтому я могу проделать определенную работу над моей диссертацией). – Faken

+0

Я периодически проверяю свои сайты, и ваши вопросы всегда те, кто интересуется мной и находятся в верхней части страницы. Это становится немного страшно. Я на самом деле рано - тренажерный зал за 2 часа. –

ответ

22

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

Вы можете использовать его и рассчитывать на него. Если первое выражение оценивается как false, второе не будет равно start.

+3

Но это нормально использовать, хотя второе условие потенциально может привести к сбою программы, если она когда-либо была оценена в состоянии, которое вызывает первое условие для возврата false? – Faken

+0

Да, любая стандартно-совместимая реализация на C++ гарантирует это. – sharptooth

+1

@Faken - Да, все в порядке. Не волнуйся! –

2

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

+0

Я понимаю, но мои маленькие симпатичные и аккуратные 13 строк кода, которые я написал, зависят от этого, чтобы нормально работать ... У меня есть много, чтобы потерять скорость обмена и эффективность, если я исправлю это. Когда я имею в виду A LOT, значит, выполнение кода будет порядка 2-3 раз медленнее. – Faken

+0

Просто не волнуйся. Мы пишем код в зависимости от оценки короткого замыкания. Вы не ожидаете, что цикл while начнется, если условие цикла в начале ложно, не так ли? То же самое происходит здесь. – sharptooth

+0

Мне интересно, почему вы согласны с тем, что это плохая практика программирования? –

4

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

1

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

1

Опираясь на короткое замыкание, поведение короткого замыкания логических операторов И и ИЛИ на C++ не должно считаться плохой практикой. Это совершенно идиоматично и часто приводит к более четкому и более сжатому коду.

E.g.

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(); 
} 
1

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

Если вы все еще не можете с ним поделать, добавьте простую инструкцию if в то время.

while (a != b) { 
    if (array[a] < c) 
    { 
     // your code goes here. 
    } 
    else 
    { 
     break; 
    } 
} 
Смежные вопросы