Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

6.5 Выражения
...
2 Между предыдущей и следующей точкой последовательности объект должен иметь сохраненное значение не более чем один раз, оценивая выражение. 72) Кроме того, предыдущее значение должны быть прочитаны только для определения сохраненного значения. 73)
...
72) Флаг состояния с плавающей точкой не является объектом и может быть установлен более одного раза в выражении. 73) Этот параграф отображает выражения выражения undefined, такие как
        i = ++i + 1;
        a[i++] = i;
позволяя
        i = i + 1;
        a[i] = i;

Итак, не делайте этого.

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

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

Expression          Result         Side effect
----------          ------         -----------
       i++               i            i = i + 1
       ++i           i + 1            i = i + 1
       i--               i            i = i - 1
       --i           i - 1            i = i - 1

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

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

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

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

  • Операторы Postfix (все имеют одинаковый приоритет, поэтому последовательности операторов будут оцениваться слева направо)
    • оператор индекса массива []
    • оператор вызова функции ()
    • операторы выбора компонентов . и ->
    • postfix ++ и --
  • Унарные операторы (все имеют одинаковый приоритет, поэтому последовательности операторов будут оцениваться слева направо)
    • префикс ++ и --
    • sizeof
    • оператор побитового отрицания ~
    • оператор логического отрицания !
    • унарные знаковые операторы - и +
    • адрес-оператора &
    • оператор разыменования *
  • Литые выражения ( имя типа )
  • Мультипликативные операторы *, /, %
  • Аддитивные операторы + и -
  • Операторы сдвига << и >>
  • Реляционные операторы <, >, <=, >=
  • Операторы равенства == и !=
  • Побитовое И &
  • Побитовое XOR ^
  • Побитовое ИЛИ |
  • Логический И &&
  • Логический OR ||
  • Условный оператор ?:
  • Операторы присваивания =, +=. -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
  • Последовательный (запятый) оператор ,

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

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

Ответ 2

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

Ответ 3

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

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

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

P - Первичный

U - Унарный

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

A - добавка

S-Shift

R-Relational

Эквивалентность

B- BitWise (и > ^ > |)

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

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

Тернарный (условный),

Назначение и

Comma.

для Assosiativity Все, кроме Unary, Assignment и Ternary, являются Слева направо.

Для полной истории PUMA см. комментарии.

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

это простой расчет Когда вы пишете  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 increment (a ++) значение a увеличивается на 1, как только управление переходит к следующей строке в программе. Следовательно printf (% d, a);  отпечатки 5 Я надеюсь, что это очистит ваши сомнения.

Ответ 9

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

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

Ответ 10

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

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

Из всех предварительных операторов -pre increment имеет наивысший приоритет

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

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

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

И приращение постов попадает в класс слева направо

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

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

Не должно быть 14, но 12

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

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

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