Как работают операторы Precedence? - PullRequest
0 голосов
/ 29 августа 2011

Я знаю, что это глупый вопрос, но я не знаю, какой шаг мне не хватает для подсчета, поэтому не могу понять, почему вывод этого кода.

int i=2;<br> int c;<br> c = 2 * - ++ i << 1;<br> cout<< c;

У меня проблемы с пониманием этой строки в этом коде:

c = 2 * - ++ i <<1;

Я получаю результат -12.Но я не могу понять, как здесь работает приоритет оператора?

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Взгляните на таблицу приоритетов операторов C ++ .

  1. ++i оценивается, получая 3.
  2. Унарный - оценивается, давая -3.
  3. Умножение выполняется 1 , получая -6.
  4. Оценивается сдвиг в битах (сдвиг влево на 1 эффективно умножает на два), получая -12.
  5. Результат -12 присваивается переменной c.

Если бы вы использовали скобки, чтобы увидеть, что делал приоритет оператора, вы бы получили

c = ((2 * (-(++i))) << 1);

Плюс, это выражение немного вводит в заблуждение из-за странного расстояния между операторами. Было бы лучше написать это c = 2 * -++i << 1;

1 Обратите внимание, что это не унарный *, который разыменовывает указатель . Это оператор умножения, который является двоичным оператором.

1 голос
/ 29 августа 2011

Приоритет оператора определяет группировку между операторами и их операндами. В вашем примере группировка выглядит следующим образом

c = ((2 * (-(++i))) << 1);

Вот как «здесь работает приоритет оператора», и это единственное, что он делает.

Результат этого выражения -6 сдвинут на один бит влево. Это происходит на вашей платформе -12.

Согласно вашему комментарию в другом ответе, вы ошибочно полагаете, что приоритет оператора как-то контролирует то, что выполняется «первым», а что выполняется «следующим». Это совершенно неверно. Приоритет оператора не имеет абсолютно никакого отношения к порядку выполнения. Единственное, что делает приоритет оператора, опять же, это определение группировки между операторами и их операндами. Не больше, не меньше.

Порядок выполнения - это совершенно другая вещь, полностью независимая от приоритета оператора. Фактически, язык C ++ не определяет никакого «порядка выполнения» для выражений, не содержащих точек последовательности внутри (включая приведенный выше).

...