Точки ассоциативности и последовательности в C - PullRequest
0 голосов
/ 02 декабря 2011

Так как ассоциативность '?' справа налево, любые 2 подряд '?' операторы должны рассматриваться как таковые, верно?

Теперь

int x=-1;
int y=x?x++?x:-1:1;

Я ожидаю, что это будет выполнено как:

int y = x ? (x++?x:-1) : 1;

Теперь, так как он выполняется справа налево, при обнаружении первого '?' в выражении значение x равно 0, а выражение равно

int y= x? 0 : 1;

следовательно, я ожидал, что y будет 1, но он показывает ноль на моем dev-cpp. Где я ошибаюсь?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

У вас неправильный порядок оценки.В a ? b : c сначала оценивается a, затем оценивается b или c.

Я пометил ваш пример, чтобы я мог определить подвыражения:

            c
int y=x?x++?x:-1:1;
      a bbbbbbbb

(a) оценивается, давая -1, поэтому (b) оценивается.Там x++ оценивается, снова получая -1, поэтому (c) оценивается.На этом этапе x равно 0.

Или, с более подробным, более ясным кодом, вы как бы сказали:

int x = -1;
int y;
if (x != 0)
{
    int new_x = x + 1;
    if (x != 0)
    {
        y = new_x;
    }
    else
    {
        y = -1;
    }
}
else
{
    y = 1;
}
1 голос
/ 02 декабря 2011

Операции:

Assign y to value = 
    if(x): --> x = -1, so true as it is non-zero
    {
      if(x): --> x = -1 ,so true as x will increment later due to post increment
       x= x +1; --> increment x, so x = 0 . This is the value assigned. So y = 0;
     else:
       -1
    }
    else: 
    {
      1
    }

Надеюсь, это поможет!

0 голосов
/ 02 декабря 2011

Ответ на ваш вопрос заключается в том, что в C / C ++ int y = x ? (x++?x:-1) : 1; мы попадем в две точки последовательности в ?.Любые операции обновления переменной с в точке последовательности будут эффективны после ее завершения.Итак, давайте посмотрим на наш пример.

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

x=-1; (Actual Value)
x=-1; (Value used in expression)
y=-1?(x++?x:-1):1;

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

x=0; (Actual Value)
x=0; (Value used in expression)
y=x;
y=0;

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

...