Точки ассоциативности и последовательности в C

StackOverflow https://stackoverflow.com/questions/8352399

Вопрос

Поскольку ассоциативность символа "?"справа налево, любые 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 ++ мы затронем две точки последовательности в ?.Любые операции обновления переменной с в точке последовательности будут эффективны после завершения этой последовательности.Итак, давайте посмотрим на наш пример.

Первая точка последовательности - это первый кодовый код слева.

родовое слово

Вторая точка последовательности - это второй кодовый код-код слева.Как упоминалось выше, операции обновления вступают в силу после последовательности, поэтому, даже несмотря на наличие ?, значение, используемое в этой последовательности, является ?, и обновленное значение будет использоваться в дальнейшем.

родовое слово

Теперь будет

родовое слово

Надеюсь, теперь это имеет смысл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top