true / false приоритет в рекурсивной функции bool - PullRequest
1 голос
/ 06 февраля 2012

Я прочитал предыдущие посты и кое-что узнал, но хочу проверить, как работают некоторые циклы.Правильно ли я понимаю, что «истина» имеет более высокий приоритет, чем «ложь»?Например:

/.../
return (true || false);

вернет "true" (независимо от порядка)?

Если у меня есть логическая рекурсивная функция, которая сама вызывает 3 варианта ... все, что мне нужно, это дляодна версия, чтобы вернуть true для всей функции, чтобы вернуть true, правильно?Приведенная ниже функция создает свой стековый фрейм, затем обратный вызов создает еще 3 фрейма стека и проходит через вызовы, затем, если один из них возвращает true, вся функция возвращает true, потому что true имеет приоритет над false ... Это предположение верно?

Т.е .:

/* This function is taking a given weight and seeing if it can be offset by available 
 * weights. Depending on what weights are available, the weights can be directly opposed
 * to "weight" (opposite side of scale) or added to... The recursive calls will either all 
 * return false, all return true, or a variation thereof.  All that I can is that if one 
 * branch returns true, the overall function returns true...
*/

bool CanMeasure(int weight, std::vector<int> &availableWeights, int index = 0)
{
    /.../
    // the below can return all true, all false, or some variation thereof...
    return (CanMeasure(weight + availableWeights[index], availableWeights, index + 1) ||
            CanMeasure(weight - availableWeights[index], availableWeights, index + 1) ||
            CanMeasure(weight, availableWeights, index + 1));
}

Спасибо, ребята!

Ответы [ 6 ]

6 голосов
/ 06 февраля 2012

true и false являются значениями, а не операторами - как таковые, они не имеют приоритета.

Однако операторы && и || действительно сокращают оценку, если результат известен; поэтому, если левое выражение дает true и вы применяете ||, правое выражение не будет оцениваться; то же самое относится к false и &&.

4 голосов
/ 06 февраля 2012

Причина, по которой return (true || false); не оценивает ложный бит, заключается в логической оценке короткого замыкания.См. Гарантируется ли оценка короткого замыкания в C ++, как в Java? .Сходное с &&, (false && true) не будет оценивать 'true'.

3 голосов
/ 06 февраля 2012

Правила для || операции:

true || true => true
true || false => true
false || true => true
false || false => false

Если один из операндов истинен, независимо от его положения, результат будет истинным. Даже если у вас есть что-то вроде false || false || false ... false || true, результат будет верным.

3 голосов
/ 06 февраля 2012

Да (будет возвращено true независимо от заказа).Условия в or оцениваются слева направо, и когда наткнулся на первое true, все условие возвращает true.

В вашем примере:

return (CanMeasure(weight + availableWeights[index], availableWeights, index + 1) ||
        CanMeasure(weight - availableWeights[index], availableWeights, index + 1) ||
        CanMeasure(weight, availableWeights, index + 1));

не все условия оцениваются обязательно.Если первый из них оценивается как true, остальные не будут выполняться, а функция просто вернет true.

Это называется коротким замыканием.

Давайте посмотрим на некоторыенезаполненный код:

   if ( foo() || goo() )
0041152E  call        foo (41111Dh) 
00411533  movzx       eax,al 
00411536  test        eax,eax 
00411538  jne         wmain+36h (411546h) 
0041153A  call        goo (4111A9h) 
0041153F  movzx       eax,al 
00411542  test        eax,eax 
00411544  je          wmain+49h (411559h) 

В этом примере foo() и goo() являются обеими функциями, возвращающими bool.

Инструкция

00411538  jne         wmain+36h (411546h) 

сообщает среде выполнениявыпрыгнуть из условия, если foo() оценено как true.

Этот код не оптимизирован, поэтому это не функция оптимизации.

1 голос
/ 06 февраля 2012

Да, одного возвращаемого значения, которое является истинным, достаточно для определения результата.Это определяется оценкой короткого замыкания.

http://en.wikipedia.org/wiki/Short-circuit_evaluation

0 голосов
/ 06 февраля 2012

Не думаю, что этот вопрос касается оценки короткого замыкания. И «истина имеет более высокий приоритет, чем ложь» не имеет смысла. True - это значение, а не операция.

Причина, по которой true || false возвращает true, является просто логикой и не имеет ничего общего с программированием. Логическая операция И и ИЛИ не заботится о порядке их входов. Они просто заботятся о том, «сколько правды». В частности, AND возвращает истину, если оба истинны, а ИЛИ возвращает истину, если хотя бы один истина.

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

...