Как будет оцениваться x? Y: a? B: c? - PullRequest
0 голосов
/ 14 марта 2019

Ассоциативность условного оператора - справа налево, поэтому сначала нужно решить самый правый условный оператор (проверяется, является ли a истинным или нет), но в книге упоминается, что первый x будет проверен

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Тот факт, что условный оператор связывается справа, означает, что x?y:a?b:c будет проанализирован так, как если бы он был записан x?y:(a?b:c).Если бы он ассоциировался слева, он был бы проанализирован как (x?y:a)?b:c, что почти наверняка стало бы неожиданностью (если вы не привыкли к PHP).

Но ни одна из этих скобок не меняет выполнение заказ .Первый операнд условного оператора всегда вычисляется первым.

1 голос
/ 14 марта 2019

Выражение

int result = x?y:a?b:c;

может быть записано как

int result;
if (x)
{
    result = y;
}
else
{
    if (a)
    {
        result = b;
    }
    else
    {
        result = c;
    }
}

. Поэтому сначала необходимо оценить x, чтобы определить, будет ли блок if или elseбыть выполненным.


Обратите внимание, что троичный оператор вычисляет только то выражение, которое ему необходимо.Когда x истинно, y оценивается.Когда x ложно, подвыражение a?b:c оценивается.

Фактически, стандарт C требует, чтобы код оценивал только необходимое выражение.Вот что говорится в разделе 6.5.15 / p4:

Первый операнд вычисляется;между оценкой и оценкой второго или третьего операнда существует точка последовательности (в зависимости от того, что оценивается).Второй операнд оценивается, только если первый сравнивается с неравным 0;третий операнд оценивается, только если первый сравнивается равным 0;Результатом является значение второго или третьего операнда (в зависимости от того, что оценивается), преобразованное в тип, описанный ниже.

В выражении x?y:a?b:c,

  • первый операнд x
  • второй операнд y
  • третий операнд a?b:c

Таким образом, стандарт прямо запрещает выполнение кода кодомлюбая часть a?b:c, если x не сравнивается равным 0.


Ассоциативность определяет только то, как операнды интерпретируются.Первый, второй и третий операнды, перечисленные выше, основаны на ассоциативности справа налево.

Если ассоциативность троичного оператора была слева направо, то

  • первый операнд будет x?y:a
  • второй операнд будет b
  • третий операнд будет c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...