Это выражение (a-- == 10 && a-- == 9) оценивается слева направо,
Да, в основном, но только потому, что &&
special.
и a по-прежнему равен 10 в a-- == 10
Да, потому что a--
возвращает старое значение.
но a равно 9 для a-- == 9.
Да, поскольку точка последовательности в &&
гарантирует, что обновление до значения a
завершено до оценки RHS.
1) Существует ли четкое правило относительно оценки после приращения?
На мой взгляд, лучший ответ - «нет».Побочные эффекты из-за ++
и --
завершаются в какой-то момент до следующей точки последовательности, но кроме этого, вы не можете сказать.Для четко определенных выражений не имеет значения, когда побочные эффекты завершены.Если выражение чувствительно к завершению побочного эффекта, это обычно означает, что выражение не определено.
Из этого примера кажется, что оно вычисляется до &&, но после ==.Это потому, что логический оператор && делает a-- == 10 полным выражением, поэтому a обновляется после выполнения?
В основном да.
2) Такжедля c / c ++ некоторые операторы, такие как декремент префикса, выполняются справа налево
Осторожно.Я не уверен, что вы имеете в виду, но что бы это ни было, я почти уверен, что это неправда.
, поэтому a == - сначала уменьшает a до 9, а затем сравнивает 9 ==9.
Нет, a == --a
не определено.Нет никаких сведений о том, что он делает.
Есть ли причина, почему C / C ++ разработан таким образом?
Да.
Я знаю, что для Java все наоборот (оценивается слева направо).
Да, Java отличается.
Вот несколько рекомендаций, которые помогут вам понять оценкувыражений C:
Изучите правила приоритета операторов и ассоциативности.Для «простых» выражений эти правила сообщают вам практически все, что вам нужно знать об оценке выражения.Учитывая a + b * c
, b
умножается на c
, а затем продукт добавляется к a
, из-за более высокого приоритета *
над +
.Учитывая a + b + c
, a
добавляется к b
, а затем сумма добавляется к c
, потому что +
ассоциируется слева направо.
За исключениемассоциативность (как упомянуто в пункте 1), старайтесь не использовать слова «слева направо» или «справа налево» для оценки вообще .C не имеет ничего общего с оценкой слева направо или справа налево.(Очевидно, что Java отличается.)
Побочные эффекты возникают из-за сложностей.(Когда я говорил «простые» выражения »в пункте 1, я в основном имел в виду« выражения без побочных эффектов ».) К побочным эффектам относятся (а) вызовы функций, (б) назначения с =
, (в) назначения с +=
, -=
и т. Д., И, конечно, (d) увеличивается / уменьшается с ++
и --
.(Если имеет значение, когда вы выбираете из переменной, что обычно имеет место только для переменных, квалифицированных как volatile
, мы можем добавить (e) выборки из volatile
переменных в список.) В общем Вы не можете сказать, когда происходят побочные эффекты .Постарайтесь не заботиться.Пока вам все равно (если ваша программа нечувствительна к порядку, в котором побочные эффекты имеют значение), это не имеет значения.Но если ваша программа чувствительна к , она, вероятно, не определена.(Подробнее см. Пункты 4 и 5 ниже.)
Вы никогда не должны иметь двух побочных эффектов в одном выражении, которые пытаются изменить одну и ту же переменную.(Примеры: i = i++
, a++ + a++
.) Если вы это сделаете, выражение не определено.
С одним классом исключений у вас никогда не должно быть побочного эффекта, который пытается изменить переменную, которая также используется в другом месте в том же выражении.(Пример: a == --a
.) Если вы это сделаете, выражение не определено.Исключение составляют случаи, когда доступное значение используется для вычисления значения, которое будет сохранено, как в i = i + 1
.