Ярлык для запоминания порядка оценки и приоритета операторов в C

есть ли какой-либо ярлык или лучше всего запомнить приоритет и порядок оценки в C, потому что он играет главную роль, и я или (большинство из нас) обычно забывают и заканчивают беспорядок. Помогите мне, пожалуйста….

Я хочу привести пример для этого … скажем ..

void main() { int a=1; a = a++ + ++a; printf("%d",a); }//prints 5; void main() { int a=1; int x; x = a++ + ++a; printf("%d",x); }//prints 4; 

также выражение
x = ++a + a++;
дает другой результат

Я надеюсь, что если post increment имеет высокий приоритет, тогда a++ нужно оценить a++ пожалуйста, сообщите мне, если я ошибаюсь и, пожалуйста, объясните мне, как это работает.

Прежде всего, выражения формы a++ + ++a , ++a + a++ и т. Д. Приводят к неопределенному поведению ; любой результат возможен. Из стандартного языка ( n1256 ):

6.5 Выражения

2 Между предыдущей и следующей точкой последовательности объект должен иметь значение, которое его хранимое значение изменялось не более одного раза путем оценки выражения. 72) Кроме того, предыдущее значение должно считываться только для определения значения, которое необходимо сохранить. 73)

72) Флаг состояния с плавающей точкой не является объектом и может быть установлен более одного раза в выражении.

73) Этот параграф отображает неопределенные выражения выражения, такие как

         i = ++ i + 1;
         a [i ++] = i;

позволяя

         i = i + 1;
         a [i] = i;

Поэтому не делайте этого.

Хорошо определенное выражение, такое как x = a++ + ++b будет анализироваться как x = ((a++) + (++b)) ; обе формы оператора ++ имеют более высокий приоритет, чем добавление, и добавление имеет более высокий приоритет, чем назначение. Результат выражения будет таким же, как x = a + (b + 1) .

Во-вторых, помните, что операторы ++ и -- имеют результат и побочный эффект , как показано ниже:

 Результат выражения Результат Побочный эффект
 ---------- ------ -----------
        i ++ ii = i + 1
        ++ ii + 1 i = i + 1
        i - ii = i - 1
        --ii - 1 i = i - 1

Важно помнить, что побочный эффект не должен применяться сразу после оценки выражения; он должен быть применен только к следующей точке последовательности. Возможно, что x = a++ + ++b будет оцениваться следующим образом:

 t1 = a; t2 = b + 1; x = t1 + t2; b = b + 1; a = a + 1; 

В этом случае обновления для a и b откладываются до тех пор, пока не будут добавлены и присвоены x .

Что касается приоритета, то здесь общий порядок от высокого к низкому:

  1. Постфиксные операторы (все имеют одинаковый приоритет, поэтому последовательности операторов будут оцениваться слева направо)
    • оператор индекса массива []
    • оператор вызова функции ()
    • операторов выбора компонентов . и ->
    • postfix ++ и --
  2. Унарные операторы (все имеют одинаковый приоритет, поэтому последовательности операторов будут оцениваться слева направо)
    • prefix ++ и --
    • sizeof
    • оператор побитового отрицания ~
    • логический оператор отрицания !
    • унарные знаковые операторы - и +
    • адрес-оператора &
    • оператор разыменования *
  3. Выражения Cast ( имя типа )
  4. Мультипликативные операторы * , / , %
  5. Аддитивные операторы + и -
  6. Операторы сдвига << и >>
  7. Реляционные операторы < , > , <= , >=
  8. Операторы равенства == и !=
  9. Побитовое И &
  10. Побитовое XOR ^
  11. Побитовое ИЛИ |
  12. Логические AND &&
  13. Логический ИЛИ ||
  14. Условный оператор ?:
  15. Операторы присваивания = , += . -= , *= , /= , %= , <<= , >>= , &= , ^= , |=
  16. Последовательный (запятая) оператор ,

Итак, выражения типа *x++ анализируются как *(x++) , так как postfix ++ имеет более высокий приоритет, чем унарный * . Аналогично, sizeof x + 1 анализируется как (sizeof x) + 1 , так как sizeof имеет более высокий приоритет, чем добавление. Выражение типа p++->x анализируется как (p++)->x ; оба оператора postfix ++ и -> имеют одинаковый приоритет, поэтому они анализируются слева направо.

Это примерно так же быстро, как ярлыки; когда есть сомнения, используйте круглые скобки.

Полюбите профи: добавьте круглые скобки, когда вы не уверены. Тогда вам не нужно помнить, плюс код будет легче читать.

Существует ярлык для запоминания оператора C с приоритетом.

PUMA REBL (заклинание «REBL», как будто «REBEL»).

«I» в IS не представляет никакого оператора и используется для завершения предложения.

(Примечание: все операторы с ассоциативностью не указаны слева направо).

P – Первичный

U – Унары

M – мультипликативный

A – добавка

S-Shift

R-Relational

Электронное равенство

B-BitWise (&> ^> |)

L-Логический (логический &&> логический ||)

и последние три оператора

Т-тройная

A-Assignment

C-Запятая

для ассоциативности Все, кроме унарного, назначаемого и тройного, слева направо (AUTO едет справа, т. е. задание, унарное и тройное справа налево).

рекомендуется ознакомиться с комментариями к полной истории PUMA.

Если вы считаете, что это сбивает с толку, тогда кто-нибудь прочтет ваш код. Если есть сомнения, используйте скобки, чтобы подчеркнуть.

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

  • C Таблица приоритетов оператора

Вы не должны полагаться на свою память при приоритете оператора. Только в очевидных случаях. Который – предрасположенность арифметических операторов, + – * /%. Также, зная, что ++ и – имеют более высокий приоритет, чем *, чтобы иметь возможность правильно читать выражения, такие как *p++ = *q++; Побитовые операции имеют сумасшедшие правила приоритета. ВСЕГДА используйте круглые скобки для них.

Чтобы узнать приоритет оператора, попробуйте следующее: 1: ARLA означает: A-> Арифметический оператор R-> Реляционный оператор L-> Логический оператор A-> Оператор присваивания 2: BODMAS B = первые скобки ((,)) O = порядки (как мощность квадрат и т. д.) D = деление (/) M = умножение (*) A = сложение (+) S = вычитание (-)

это простой расчет. Когда вы пишете int a = 1; x = a ++ + ++ a; Из-за оператора приращения префикса (в ++ a) значение ‘a’ станет равным 2. Следовательно, текущее выражение эквивалентно x = 2 + 2; // x = 4 Как только управление переходит к следующей строке, значение a увеличивается на 1 из-за оператора постфикса, теперь a = 3

Теперь рассмотрим этот оператор int a = 1; a = a ++ + ++ a; В этом утверждении, как объяснено выше, значение «a» будет равно выражению a = 2 + 2 ;. // означает a = 4 Но из-за оператора приращения postfix (a ++) значение a увеличивается на 1, как только управление переходит к следующей строке в программе. Поэтому printf (% d, a); печатает 5 Я надеюсь, что это очистит ваши сомнения

В C таблица приоритетов определяет порядок оценки выражения, а также определяет правила ассоциации. Используя это правило, мы можем оценить оператор с равным приоритетом (R-> L OR L-> R) в выражении.
Вы указываете,
a = 1;
x = a ++ + ++ a;
1: ++ a then exp: a (2) ++ + 2 = 4 назначить x
2: а затем приращение a, становится a = 3

предположим, a = a ++ + ++ a; затем
приращение a
2 + 2 назначить (4). приращение a (5).

Ответ Promod или его объяснения неверны

Правильный способ запоминания

Из всех пре-операторов -pre приращение имеет наивысший приоритет

И всех операций приращения post -post с минимальным приоритетом

Допуск имеет более низкий приоритет, чем операторы pre и post increment

Теперь рассмотрим тот факт, что Pre increment попадает в категорию справа налево

Приращение постов попадает в class слева направо

Принимая во внимание два случая, можно разработать код

 i = 1; i=i++ + ++i + ++i + i++; 

Быть не 14, а 12

Средние два выражения оцениваются до 4, затем 4 + 4 + 4

«Пошаговый прирост / декремент имеют высокий приоритет, но фактический приращение или декремент операнда задерживается (выполняется до того, как оператор завершит выполнение)».

Это доказательство ссылки введите ссылку здесь