Почему «k» не увеличивается в выражении «m = ++ i && ++ j || ++ k “, когда” ++ i && ++ j “оценивается как true?

Разве отдельные выражения в составном логическом выражении AND / OR не должны быть оценены прежде, чем логические операторы будут применены к их результату? Почему ++k нетронутым в условии m = ++i && ++j || ++k m = ++i && ++j || ++k для следующей программы:

  #include int main() { int i=-3, j=2, k=0, m; m = ++i && ++j || ++k; printf("%d, %d, %d, %d\n", i, j, k, m); return 0; } 

Выход: -2,3,0,1

Но я ожидаю, что результат -2,3,1,1

Вы должны избегать кодирования такого нечитаемого кода. Он фактически анализируется как

 m = (++i && ++j) || ++k; 

Поэтому, как только j >= 0 условие ++j всегда истинно, поэтому ++k не оценивается, так как && является сокращением, а затем, но || является короткой или другой (поэтому они не могут оценить свой правый операнд).

Итак, && оценивается следующим образом: левый операнд оценивается, если он является ложным, он возвращается, а затем только тогда, когда он является истинным (т. Е. Не равным 0 ), правый операнд оценивается и возвращается как результат вычисления && . Аналогично || оценивается следующим образом: левый операнд оценивается. Если оно истинно (отличное от нуля), оно становится результатом || ; или же правый операнд оценивается и является результатом || выражение.

В частности, при кодировании if (x > 0 && 20/x < 5) деление никогда не предпринимается при x==0 .

Читайте также операторов википедии в C & C ++ и оценке коротких замыканий и ленивых страницах оценки ; и, пожалуйста, пройдите несколько часов, чтобы прочитать хорошую книгу программирования C.

Логические операторы имеют оценку короткого замыкания, то есть как только значение определяется для выражения, остальная часть выражения не оценивается.

например, m = ++i && ++j || ++k; m = ++i && ++j || ++k; в этом ++ i -> true, ++ j -> true (ненулевое значение), следовательно m = true && true || ++k; m = true && true || ++k;

теперь true && true истинно так

 m = true || ++k 

Как и в операторе OR, если 1 сторона истинна, другая не оценивается, поэтому результат верен.

Следовательно, k не увеличивается.

Это ярлык для логических операторов, в вашем случае оператор || , Когда первый операнд true , для второго операнда невозможно повлиять на результат. Это всегда будет верно, неважно, что может дать второй операнд. Таким образом, второй операнд не оценивается.

То же самое касается логического оператора && , если первый операнд окажется false . Второй операнд не имеет значения, результат всегда будет false а второй операнд для него не будет оцениваться.

&& и || являются логическими операторами, и вы используете их из контекста, который является нечетным (ok для C / C ++, но у вас будут ошибки типа в Java или C #).

Вы только что открыли операторы короткого замыкания – вам не нужно оценивать все выражение, если вы «знаете», что это правда. т.е. i и j не равны нулю, поэтому вам не нужно ничего делать с k, так как вы знаете, что выражение истинно.

m = ++ i && ++ j || ++ к;

Над строкой кода выполняется ++ i и ++ j вначале и не выполняется ++ k, поскольку он написан после || (ИЛИ)

Операторы логических цепей не выполняются, если ранее оператор был истинным уже в случае || и false в случае &&

Следовательно, k нетронутый

  • Являются ли закодированные логические операторы короткими законами? И порядок оценки?
  • Ясное, непрофессиональное объяснение разницы между | и || в c #?
  • Простые логические операторы в Bash
  • Логические операторы в JavaScript - как вы их используете?
  • В чем разница между & и && в MATLAB?
  • !! c, является двумя НЕ?
  • Давайте будем гением компьютера.