Логические операторы ИЛИ и запятые эквивалентны?

Сегодня я нашел синтаксис, которого никогда раньше не видел. Являются || а также , тот же самый?

bool f() {

cout << "f";
return true;
}

bool g() {

cout << "g";
return true;
}

int main() {if(f(),g())
{
cout<<"OK with ,";
}

cout<<endl;

if(f()||g())
{

cout<<"OK with ||";
}

return 0;
}

Из вывода этой программы это выглядит так:

fgOK with ,
fOK with ||

Они точно такие же, или есть небольшие различия?

-6

Решение

f(),g() значит оценивать f() затем оцените g() и вернуться g() так как ваш g() возвращается true это то, что возвращается if

Так что нет, операторы совершенно разные.

Вы можете увидеть разницу, если вы измените свою функцию для возврата false от g(), Состояние f()||g() будет по-прежнему оценивать true в то время как f(),g() вернусь false,

4

Другие решения

Это (оператор запятой)

if(f(),g())

оценит оба f() а также g() и вернуть значение второго операнда g()

Логический оператор ИЛИ

if(f()||g())

не буду оценивать g() если f() оценивает как истинное. Это известно как оценка короткого замыкания — если f () возвращает true, то условие логического ИЛИ уже выполнено — следовательно, нет смысла оценивать g(),

Так они НЕ то же самое на всех, хотя при определенных условиях вы можете увидеть то же общее поведение.

3

  • || является логическим оператором ИЛИ и по стандарту следует оценка короткого замыкания (то есть он не будет оценивать второй операнд, если первого уже достаточно для определения всего логического выражения)

  • , является оператором запятой, который оценивает оба, но просто возвращает значение второго операнда.

Кстати, вы должны увидеть что-то вроде:

fgOK with ,
fOK with ||

причина, по которой вы этого не видите, может быть в том, что вы используете компилятор, который не следует строго стандартам (я подозреваю, что MSVC ..)

http://ideone.com/8dSFiY

2

Это совершенно разные операторы, которые служат совершенно другим целям.

Основное отличие заключается в том, что:

  • , оператор (если не перегружен) оценит все свои аргументы и вернет последний, несмотря ни на что.
  • || оператор будет оценивать все аргументы, пока не достигнет первого trueзначение ish и не будет оценивать остальное.

Это также причина, по которой вы заявляете, что вы получите неправильно.

2