In C (x||y)
- логическое выражение - выражение, результатом которого всегда является true (1) или false (0). То же самое верно для &&
(и) и !
(не).
И, if (x = y)
- это то же самое, что и if (y)
с побочным эффектом назначения y для x. То есть:
Для оценки:
if (var = -5 || 5) ...
Это
if ((var = -5) || 5) ...
или?
if (var = (-5 || 5)) ...
Это второе, потому что | | имеет более высокий приоритет: https://en.cppreference.com/w/c/language/operator_precedence
Потому что:
(-5 || 5) ---> 1
... теперь у нас есть ...
if (var = 1) ...
1 is присваивается переменной var (=
- присваивание, ==
- равенство значений) Поскольку в C оператор a=b
также является выражением, новое значение которого является новым значением, если a, теперь у нас есть:
if (var) ...
... потому что тесты верны, потому что var
равен 1
, а ненулевые целые числа истинны в C.