Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???
Да определено. В случае использования оператора || проверяются все выражения до первого соответствия (true). В случае && до первого несоответствия (false)
Здравствуйте, Vovka_R, Вы писали:
V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???
Да.
Здравствуйте, 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.
Здравствуйте, Vovka_R, Вы писали: V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???
А зачем вам знать стандартизовано ли такое поведение?
Ясно одно что это так и никак иначе!
Здравствуйте, maxidroms, Вы писали:
M>Здравствуйте, Vovka_R, Вы писали: V_R>>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???
M>А зачем вам знать стандартизовано ли такое поведение?
Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.
M>Ясно одно что это так и никак иначе!
Верно сказано. Теперь и я это знаю!!!
M>>А зачем вам знать стандартизовано ли такое поведение? V_R>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.
Казус в том, что это не совсем так. Можно поглядеть например здесь.
V_R>Так вот вопрос в следующем. Знаю точно, что если функция f1 выполнится, то следующее условие в операторе if даже проверяться не будет, т.е. f2 даже не вызовется. А вот и вопрос: определено ли такое поведение стандартом???
V_R>Спасибо!!!
Тут дело не в стандарте, а в операции ИЛИ ( || )
Эта операция делает ИЛИ то, ИЛИ другое.
F>Тут дело не в стандарте, а в операции ИЛИ ( || ) F>Эта операция делает ИЛИ то, ИЛИ другое.
Оператор, значит, такой встаёт, смотрит, что тут у него по сторонам. Потом думает "что бы мне сделать из этого". И делает или то или другое.
А && — это его более трудолюбивый брат — он всегда делает и то и другое.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, frenchman, Вы писали:
F>>Тут дело не в стандарте, а в операции ИЛИ ( || ) F>>Эта операция делает ИЛИ то, ИЛИ другое.
R>Оператор, значит, такой встаёт, смотрит, что тут у него по сторонам. Потом думает "что бы мне сделать из этого". И делает или то или другое. R>А && — это его более трудолюбивый брат — он всегда делает и то и другое.
Здравствуйте, Vovka_R, Вы писали:
M>>А зачем вам знать стандартизовано ли такое поведение? V_R>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.
Если какая-то конструкция языка влечет за собой неопределенное поведение, то стоит ли использовать ее, учитывая особенности конкретного компилятора?
Здравствуйте, i-maverick, Вы писали:
IM>Здравствуйте, Vovka_R, Вы писали:
M>>>А зачем вам знать стандартизовано ли такое поведение? V_R>>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.
IM>Если какая-то конструкция языка влечет за собой неопределенное поведение, то стоит ли использовать ее, учитывая особенности конкретного компилятора?
Нет, не стоит, даже если ты точно знаешь, что сделает компилятор.
Мало того, что не будет переносимости кода на другие компиляторы,
так ведь еще и при переходе на новую версию того же компилятора
могут возникнуть проблемы, причину которых сложно обнаружить.
P.S. Компиляторы (C++ Builder) сами по себе являются проблемой.
Здравствуйте, Alex_Avr, Вы писали:
V_R>>>Да интересно стало, во всех ли компиляторах применяется такое правило. Я пишу под VC.NET, а если сяду за, например, Borland, то там так же будет или нет. Раз это стандартом описано, значит это везде так будет.
IM>>Если какая-то конструкция языка влечет за собой неопределенное поведение, то стоит ли использовать ее, учитывая особенности конкретного компилятора?
A_A>Нет, не стоит, даже если ты точно знаешь, что сделает компилятор. A_A>Мало того, что не будет переносимости кода на другие компиляторы, A_A>так ведь еще и при переходе на новую версию того же компилятора A_A>могут возникнуть проблемы, причину которых сложно обнаружить.
Спасибо конечно, но это был фактически не вопрос, а ответ.