2015-07-21 2 views
-5

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

if((i <= n) && ((i+m) >= n){ 
    //do something..... 
}; 

Это в основном логическое И условие, и если оба операнда истинны, то результат условие истинно. Однако с оценкой короткого замыкания C++ проверяют только, является ли первое условие истинным, и если да, то он никогда не проверяет, является ли второе условие истинным. В правильном математическом смысле, как это булевой тест? Это полностью срывает логику моего кода, и вместо этого я должен был написать это:

if((i <= n){ 
    if((i+m) >= n){ 
     //do something...... 
    } 
} 

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

+2

Вы обманываете свою жену, если она во вторник, и если она посещает ее родителей. Вы обманываете ее каждый вторник? –

+2

Кому-то нужно пересмотреть свои [законы Де Моргана] (https://en.wikipedia.org/wiki/De_Morgan%27s_laws) – CoryKramer

+0

У вас есть опечатка во втором условии - должна быть i + m – cup

ответ

8

Однако с оценкой короткого замыкания C++ проверяет только, является ли первое условие истинным, и если да, то оно никогда не проверяет, является ли второе условие истинным.

Это касается ||, но не &&. && короткое замыкание, если первое условие - false. Ваши два фрагмента эквивалентны.

2

Просто, чтобы убедиться, что нет никаких недоразумений здесь:

(a AND b) 

будет FALSE для любого значения b, пока a ЛОЖЬ. Точно так же,

(a OR b) 

будет верно для любого значения b до тех пор, как a ИСТИНА.

Так, в C++, (a && b) короткое замыкание когда a ложно и (a || b) замыкают накоротко когда a верно.

Условия обычно не имеют побочных эффектов. Если да, то вы можете быть "умным" и сделать:

if (a && do_stuff()) {} 

вместо

if (a) { do_stuff(); } 

или быть действительно глупо и делать

if (a && do_stuff()) { do_more_stuff(); } 

, когда вы на самом деле имел в виду сделать:

if (do_stuff() && a) { do_more_stuff(); } 

вот почему вы не обычно имеют условия с побочными эффектами. Они, конечно, полезны и используются. А поскольку и evaluation order and the short-circuiting are part of the standard, вы можете безопасно их использовать.

1

Я думаю, вы немного запутались с операторами короткого замыкания :)

  • Для & &, если выражение левой стороны ложная, комбинированный результат ложно (выражение правой части никогда не оценивается).
  • Для ||, если левая часть выражения равна true, в объединенном результате true (выражение правой части никогда не оценивается).

Это наиболее важно, когда выражение правого имеет побочных эффектов, такие как изменения значения (или вызывать некоторые функции с побочными эффектами), например:

, если ((ITR < 10) & & (++ ITR < п)) {

// делать вещи

}

Обратите внимание, что комбинированное условное выражение будет увеличивать itr от 1, только если условное выражение слева от && является истинным, поскольку в противном случае, условное выражение на правой стороне т.е. (++itr < n) никогда не оценивается.

0

Да, конечно!

С булевым И, если a является ложным, а b истинно, то (a И b) является ложным. Аналогично, если a является ложным и b является ложным, то (a AND b) является ложным.

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

2

Недостаток здесь заключается в понимании правил короткого замыкания, а не самих правил. Для любых действительных выражений a и b

if (a && b) ... 

всегда будет оценивать a. Если верно a, то b всегда будет оцениваться. Короткое замыкание происходит только в том случае, если a - false .... поскольку это гарантирует, что a && b составляет false, без необходимости оценки b.

Смежные вопросы