Russian Qt Forum

Программирование => С/C++ => Тема начата: fulkabaster от Февраль 15, 2010, 13:08



Название: Детали проверки условий
Отправлено: fulkabaster от Февраль 15, 2010, 13:08
Интересует такая штука. Если есть выражение:

Код
C++ (Qt)
if ( condition1 && condition2  ) {  do_something(); }

то правильно ли я понимаю, что в любом случае проверяются оба условия - condition1 и condition2?

А в этом случае, где вместо AND будет OR:

Код
C++ (Qt)
if ( condition1 || condition2  ) {  do_something(); }

будет ли проверяться второе условие, если первое = true?

Это к тому, что я нашел ресурс (http://www-igm.univ-mlv.fr/~lecroq/string/node14.html#SECTION00140), где объясняется работа поисковых алгоритмов (Boyer-Moore algorithm). В функции suffixes(char *x, int m, int *suff) используется переменная 'f', но она не инициализируется. Написал авторам, они ответили, что все правильно, т.к. по в первом цикле i = m-2, а g = m-1, и поэтому i<g, и f станет равной i. Но че-то я не доганаяю. Вот код:
Код
C++ (Qt)
void suffixes(char *x, int m, int *suff) {
  int f, g, i;
 
  suff[m - 1] = m;
  g = m - 1;
  for (i = m - 2; i >= 0; --i) {
     if (i > g && suff[i + m - 1 - f] < i - g)
        suff[i] = suff[i + m - 1 - f];
     else {
        if (i < g)
           g = i;
        f = i;
        while (g >= 0 && x[g] == x[g + m - 1 - f])
           --g;
        suff[i] = f - g;
     }
  }
}
Первое встречающееся условие
 if (i > g && suff[i + m - 1 - f] < i - g)
сработает непонятно, если проверяются оба выражение, т.к. во втором 'f' не инициализирована.


Название: Re: Детали проверки условий
Отправлено: DIMEDROLL от Февраль 15, 2010, 13:31
судя по моему опыту, то не проверяется, на практике встречал(а потом и сам писал) такой код:
Код:
SomeClass *pointer_some_class;
// ....

if (pointer_some_class && pointer_some_class->SomeMethod())
{

}
если бы проверялось второе условие то програма бы падала, а так все работает ;)


Название: Re: Детали проверки условий
Отправлено: Amigo_sa от Февраль 15, 2010, 13:31
Интересует такая штука. Если есть выражение:

Код
C++ (Qt)
if ( condition1 && condition2  ) {  do_something(); }

то правильно ли я понимаю, что в любом случае проверяются оба условия - condition1 и condition2?

По стандарту С++ не проверяется второе условие, если первое - ложь. Мы в коде частенько используем выражение типа
Код:
if (pointer && pointer->doSomething())
{
///
}
Если бы pointer был 0, то все грохалось бы...


Сообщество мыслит одинаково =)


Название: Re: Детали проверки условий
Отправлено: DIMEDROLL от Февраль 15, 2010, 16:28
а ты можешь привести цитату из стандарта?
ну или номер страницы...


Название: Re: Детали проверки условий
Отправлено: Amigo_sa от Февраль 15, 2010, 16:40
а ты можешь привести цитату из стандарта?
ну или номер страницы...

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
стр. 101. пп.5.14.1
Цитировать
The && operator groups left-to-right. The operands are both implicitly converted to type bool (clause 4). The result
is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second
operand is not evaluated if the first operand is false.