Точки ассоциативности и последовательности в C
-
27-10-2019 - |
Вопрос
Поскольку ассоциативность символа "?"справа налево, любые 2 последовательных символа '?'операторы должны рассматриваться как таковые, верно?
Теперь
родовое словоЯ ожидаю, что это будет выполнено как:
родовое словоТеперь, когда он выполняется справа налево, при встрече с первым символом "?"в операторе значение x равно 0, а выражение имеет вид
родовое словопоэтому я ожидал, что y будет 1, но на моем dev-cpp он показывает ноль. В чем я ошибаюсь?
Решение
У вас неправильный порядок оценки.В a ? b : c
сначала всегда оценивается a
, затем оценивается либо b
, либо c
.
Я разметил ваш пример, чтобы я мог идентифицировать подвыражения:
родовое слово (a) оценивается, давая -1, поэтому (b) оценивается.Здесь вычисляется x++
, снова возвращая -1, поэтому вычисляется (c).На данный момент код x
равно 0.
Или, если использовать более подробный и понятный код, это как если бы вы сказали:
родовое словоДругие советы
Операции:
родовое словоНадеюсь, это поможет!
Ответ на ваш вопрос заключается в том, что в int y = x ? (x++?x:-1) : 1;
C / C ++ мы затронем две точки последовательности в ?
.Любые операции обновления переменной с в точке последовательности будут эффективны после завершения этой последовательности.Итак, давайте посмотрим на наш пример.
Первая точка последовательности - это первый кодовый код слева.
родовое слово Вторая точка последовательности - это второй кодовый код-код слева.Как упоминалось выше, операции обновления вступают в силу после последовательности, поэтому, даже несмотря на наличие ?
, значение, используемое в этой последовательности, является ?
, и обновленное значение будет использоваться в дальнейшем.
Теперь будет
родовое словоНадеюсь, теперь это имеет смысл.