C: ИЛИ оператор в обратной линии? - PullRequest
0 голосов
/ 18 сентября 2018

наткнулся на некоторый код с оператором ИЛИ (||) в строке return.Может кто-нибудь объяснить, что это делает?


Вот что-то похожее на это:

int main()
{
    ...

    return (1 || 0);
}

Но на самом деле это была функция (которая вернула 1 или 0) вместо 1 и 0:

int main()
{
    ...

    return (foo(x++, y) || foo(x, y++));
}

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Логическое ИЛИ имеет свойство короткого замыкания .RHS оценивается только в том случае, если LHS оценивается как ложное.

В этом случае, поскольку операнды являются вызовом функции, поэтому

  • будет выполнен вызов функции LHS foo(x++, y).
  • Если возвращаемое значение равно 1 (ИСТИНА), RHS не будет оцениваться и будет возвращено значение 1.
  • Если возвращаемое значение равно 0, foo(x, y++)вызов функции с помощью made, и возвращаемое значение будет основано на возвращаемом значении вызова функции.
0 голосов
/ 18 сентября 2018

a || b оценивается как 1, если a не равен нулю независимо от значения b, оценивается как 1, если a равно 0, а b не равно нулю, в противном случае это 0.

То есть 1 || 0 равно 1, как и 2 || 0.

Обратите внимание, что b равно , а не , если значение a не равно нулю:если бы b была функцией, она не была бы вызвана в таком случае.Итак, в вашем примере foo(x, y++) - это , а не , называемый , включая оценку y++, если foo(x++, y) не равно нулю.

Обратите внимание, что типa || b - это int независимо от типа аргументов.СрC ++, где типом является bool.

...