if - оператор
От: Vovka_R Россия  
Дата: 22.03.06 16:31
Оценка: :))
Госпада, подскажите пожалуйста слудующую вещь.
bool f1()
{
  //...
}

bool f2()
{
  //...
}

void main()
{
  if( f1() || f2() )
  //Что-то делаем

  //...
}

Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???

Спасибо!!!
Re: if - оператор
От: Vovik1982 Россия  
Дата: 22.03.06 16:33
Оценка: 2 (1)
Да определено. В случае использования оператора || проверяются все выражения до первого соответствия (true). В случае && до первого несоответствия (false)
Re: if - оператор
От: LuciferMoscow Россия  
Дата: 22.03.06 16:33
Оценка:
Здравствуйте, Vovka_R, Вы писали:

V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???

Да.
Re: if - оператор
От: Bell Россия  
Дата: 22.03.06 16:34
Оценка:
Здравствуйте, Vovka_R, Вы писали:

V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???


Безусловно:

5.15/1
The || operator groups left-to-right. The operands are both implicitly converted to bool 
(clause 4). It returns true if either of its operands is true, and false otherwise. 
Unlike |, || guarantees left-toright evaluation; moreover, the second operand is not 
evaluated if the first operand evaluates to true.
Любите книгу — источник знаний (с) М.Горький
Re: if - оператор
От: maxidroms Россия  
Дата: 22.03.06 16:34
Оценка: -1
Здравствуйте, Vovka_R, Вы писали:
V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???

А зачем вам знать стандартизовано ли такое поведение?
Ясно одно что это так и никак иначе!
Re[2]: if - оператор
От: Vovka_R Россия  
Дата: 22.03.06 16:36
Оценка:
Ага. Понял. Спасибо БОЛЬШОЕ всем.
Re[3]: if - оператор
От: Vovik1982 Россия  
Дата: 22.03.06 16:39
Оценка:
Оценочки, оценочки ставить надо...
Re[2]: if - оператор
От: Vovka_R Россия  
Дата: 22.03.06 16:40
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>Здравствуйте, Vovka_R, Вы писали:

V_R>>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???

M>А зачем вам знать стандартизовано ли такое поведение?

Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.

M>Ясно одно что это так и никак иначе!

Верно сказано. Теперь и я это знаю!!!
Re[4]: if - оператор
От: Vovka_R Россия  
Дата: 22.03.06 16:42
Оценка:
Здравствуйте, Vovik1982, Вы писали:

V>Оценочки, оценочки ставить надо...


Ага. Готово!!!!
Re[3]: if - оператор
От: remark Россия http://www.1024cores.net/
Дата: 22.03.06 17:05
Оценка:
Здравствуйте, Vovka_R, Вы писали:


M>>А зачем вам знать стандартизовано ли такое поведение?

V_R>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.


Казус в том, что это не совсем так. Можно поглядеть например здесь.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: if - оператор
От: frenchman  
Дата: 22.03.06 17:48
Оценка: 9 (1) :))) :)))
Здравствуйте, Vovka_R, Вы писали:

V_R>Госпада, подскажите пожалуйста слудующую вещь.

V_R>
V_R>bool f1()
V_R>{
V_R>  //...
V_R>}

V_R>bool f2()
V_R>{
V_R>  //...
V_R>}

V_R>void main()
V_R>{
V_R>  if( f1() || f2() )
V_R>  //Что-то делаем

V_R>  //...
V_R>}
V_R>

V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???

V_R>Спасибо!!!




Тут дело не в стандарте, а в операции ИЛИ ( || )
Эта операция делает ИЛИ то, ИЛИ другое.
Re[2]: if - оператор
От: programmater  
Дата: 22.03.06 17:57
Оценка:
Здравствуйте, frenchman, Вы писали:



F>Тут дело не в стандарте, а в операции ИЛИ ( || )

F>Эта операция делает ИЛИ то, ИЛИ другое.

Сам-то понял чё сказал? Или это шутка такая, которую я не догоняю?
Re[2]: if - оператор
От: remark Россия http://www.1024cores.net/
Дата: 22.03.06 18:01
Оценка: :))) :))
Здравствуйте, frenchman, Вы писали:


F>Тут дело не в стандарте, а в операции ИЛИ ( || )

F>Эта операция делает ИЛИ то, ИЛИ другое.

Оператор, значит, такой встаёт, смотрит, что тут у него по сторонам. Потом думает "что бы мне сделать из этого". И делает или то или другое.
А && — это его более трудолюбивый брат — он всегда делает и то и другое.




1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: if - оператор
От: programmater  
Дата: 22.03.06 18:06
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, frenchman, Вы писали:



F>>Тут дело не в стандарте, а в операции ИЛИ ( || )

F>>Эта операция делает ИЛИ то, ИЛИ другое.

R>Оператор, значит, такой встаёт, смотрит, что тут у него по сторонам. Потом думает "что бы мне сделать из этого". И делает или то или другое.

R>А && — это его более трудолюбивый брат — он всегда делает и то и другое.

Хорошо сказал. Уважаю!
Re[3]: if - оператор
От: jazzer Россия Skype: enerjazzer
Дата: 22.03.06 18:41
Оценка:
Здравствуйте, Vovka_R, Вы писали:

V_R>Раз это стандартом описано, значит это везде так будет.


Твои бы слова да Богу в уши
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: if - оператор
От: i-maverick Россия  
Дата: 23.03.06 08:16
Оценка:
Здравствуйте, Vovka_R, Вы писали:

M>>А зачем вам знать стандартизовано ли такое поведение?

V_R>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.

Если какая-то конструкция языка влечет за собой неопределенное поведение, то стоит ли использовать ее, учитывая особенности конкретного компилятора?
Re[2]: if - оператор
От: i-maverick Россия  
Дата: 23.03.06 08:31
Оценка:
Здравствуйте, frenchman, Вы писали:

F>Тут дело не в стандарте, а в операции ИЛИ ( || )

F>Эта операция делает ИЛИ то, ИЛИ другое.

+10!
Re[4]: if - оператор
От: Alex_Avr Россия  
Дата: 23.03.06 08:37
Оценка:
Здравствуйте, i-maverick, Вы писали:

IM>Здравствуйте, Vovka_R, Вы писали:


M>>>А зачем вам знать стандартизовано ли такое поведение?

V_R>>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.

IM>Если какая-то конструкция языка влечет за собой неопределенное поведение, то стоит ли использовать ее, учитывая особенности конкретного компилятора?


Нет, не стоит, даже если ты точно знаешь, что сделает компилятор.
Мало того, что не будет переносимости кода на другие компиляторы,
так ведь еще и при переходе на новую версию того же компилятора
могут возникнуть проблемы, причину которых сложно обнаружить.

P.S. Компиляторы (C++ Builder) сами по себе являются проблемой.
С уважением, Александр Авраменко.
Re[5]: if - оператор
От: Alex_Avr Россия  
Дата: 23.03.06 08:43
Оценка:
A_A>P.S. Компиляторы (C++ Builder) сами по себе являются проблемой.

Опечатка, имелось в виду

P.S. Компиляторы Borland (C++ Builder) сами по себе являются проблемой.
С уважением, Александр Авраменко.
Re[5]: if - оператор
От: i-maverick Россия  
Дата: 23.03.06 08:46
Оценка:
Здравствуйте, Alex_Avr, Вы писали:

V_R>>>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.


IM>>Если какая-то конструкция языка влечет за собой неопределенное поведение, то стоит ли использовать ее, учитывая особенности конкретного компилятора?


A_A>Нет, не стоит, даже если ты точно знаешь, что сделает компилятор.

A_A>Мало того, что не будет переносимости кода на другие компиляторы,
A_A>так ведь еще и при переходе на новую версию того же компилятора
A_A>могут возникнуть проблемы, причину которых сложно обнаружить.

Спасибо конечно, но это был фактически не вопрос, а ответ.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.