Russian Qt Forum
Ноябрь 24, 2024, 09:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Детали проверки условий  (Прочитано 3421 раз)
fulkabaster
Гость
« : Февраль 15, 2010, 13:08 »

Интересует такая штука. Если есть выражение:

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

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

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

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

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

Это к тому, что я нашел ресурс, где объясняется работа поисковых алгоритмов (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' не инициализирована.
« Последнее редактирование: Февраль 15, 2010, 13:14 от fulkabaster » Записан
DIMEDROLL
Гость
« Ответ #1 : Февраль 15, 2010, 13:31 »

судя по моему опыту, то не проверяется, на практике встречал(а потом и сам писал) такой код:
Код:
SomeClass *pointer_some_class;
// ....

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

}
если бы проверялось второе условие то програма бы падала, а так все работает Подмигивающий
Записан
Amigo_sa
Гость
« Ответ #2 : Февраль 15, 2010, 13:31 »

Интересует такая штука. Если есть выражение:

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

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

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


Сообщество мыслит одинаково =)
Записан
DIMEDROLL
Гость
« Ответ #3 : Февраль 15, 2010, 16:28 »

а ты можешь привести цитату из стандарта?
ну или номер страницы...
Записан
Amigo_sa
Гость
« Ответ #4 : Февраль 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.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.186 секунд. Запросов: 21.