Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Выполнение условного оператора


Автор: polin11 26.2.2019, 19:44
Выполнение условного оператора
Подскажите знающие люди новичку в С++
есть условный оператор:
1) if( condition1 && condition2 )
будет ли проверено условие condition2, если первое условие  condition1 ложно?
2) Соответственно if( condition1 || condition2 )
будет ли проверено условие condition2, если первое условие  condition1 верно?
Желательно ссылкой на документацию или какую-нибудь умную книгу или статью

Автор: kapbepucm 27.2.2019, 14:30
Предположу, что зависит от оптимизаций компилятора. Например, мой g++ в первом случае не проверяет condition2, чтобы проверял, нужны извращения smile
Код
#include <iostream>

using namespace std;

bool condition1()
{
  cout << "  condition1 check" << endl;
  return false;  
}

bool condition2()
{
  cout << "  condition2 check" << endl;
  return true;  
}

bool condition_AND(bool c1, bool c2)
{
  return c1 && c2;
}

int main(void)
{
  cout << "normal check:" << endl;
  if (condition1() && condition2()) {}
  cout << "feature check:" << endl;
  if (condition_AND(condition1(), condition2())) {}
  return 0;
}

Автор: LeonidPr 27.2.2019, 15:31
Думаю можно начать с этого
https://en.wikipedia.org/wiki/Short-circuit_evaluation

А вот тут прям обсуждение того, что вы спрашиваете со ссылками на стандарты
https://stackoverflow.com/questions/628526/is-short-circuiting-logical-operators-mandated-and-evaluation-order

Автор: xvr 27.2.2019, 15:35
Цитата(kapbepucm @  27.2.2019,  14:30 Найти цитируемый пост)
Предположу, что зависит от оптимизаций компилятора.

Не зависит. && и || работают по схеме shortcut - если результат после первой проверки известен, то вторая не выполняется.

С99 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 

Глава 6.5.13 п4:
Цитата

Unlikethe bitwise binary&operator,the&&operator guarantees left-to-right evaluation;there  is  a  sequence  point  after  the  evaluation  of  the  first  operand.If  the  first  operandcompares equal to 0, the second operand is not evaluated.


Следующая глава, п4
Цитата

Unlikethe bitwise|operator,the||operator guarantees left-to-right evaluation; there isasequence  point  after  the  evaluation  of  the  first  operand.If  the  first  operand  comparesunequal to 0, the second operand is not evaluated


Плюсы найдите сами

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)