Ассоциативность оператора в C специфически префикс и постфикс приращение и уменьшение

StackOverflow https://stackoverflow.com/questions/2395423

  •  25-09-2019
  •  | 
  •  

Вопрос

В операции C ассоциативность такова для увеличения, уменьшения и назначения.

  2. postfix ++ and -- 
  3. prefix ++ and -- 
  16. Direct assignment = 

Полный список встречается здесь Операторы Wikipedia в C

Мой вопрос, когда у нас есть

int a, b;

b = 1;
a = b++;

printf("%d", a); // a is equal to 1

b = 1;
a = ++b;

printf("%d", a); //a is equal to 2

Почему равный 1 с B ++, когда оператор PostFix Awarment должен произойти до прямого назначения?

И почему оператор приращения префикса отличается от Postfix, когда они оба перед назначением?

Я уверен, что я не понимаю что-то очень важное, когда дело доходит до операции ассоциативности.

Это было полезно?

Решение

Оператор Postfix. a++ будет увеличиваться a а затем верните исходное значение, то есть подобное этому:

{ temp=a; a=a+1; return temp; }

и префикс ++a вернет новое значение, то есть

{ a=a+1; return a; }

Это не имеет значения для оператора приоритет.

(И ассоциативность управляет, a-b-c равняться (a-b)-c или a-(b-c).)

Другие советы

Оператор Приоритет и ассоциативность не говорит вам, что происходит до И что происходит после. Отказ Оператор Приоритет / Ассоциативность не имеет ничего общего с этим. В языке C языка временных отношений, таких как «раньше» или «после» определены так называемыми точки последовательности а также Только по точкам последовательности (и это совершенно отдельная история).

Оператор Приоритет / Ассоциативность просто говорит вам, какие операнды принадлежат к каким операторам. Например, выражение a = b++ может быть формально интерпретируется как (a = b)++ и в качестве a = (b++). Отказ Оператор Приоритет / Ассоциативность в этом случае это просто говорит вам, что последняя интерпретация правильная, а первая неверна (т.е. ++ относится к b и не к результату a = b).

Это еще раз, не означает, что b должен быть увеличен первым. Оператор Приоритет / Ассоциативность, еще раз, развернувшись с тем, что происходит «сначала» и что происходит «следующим». Это просто говорит вам, что результат b++ выражение присвоено a. Отказ По определению, результат b++ (Постфикс приращение) оригинал ценность b. Отказ Вот почему a Получу оригинал ценность b, который 1. Когда переменная b будет увеличиваться совершенно не имеет значения, пока a получает назначение bС. оригинал стоимость. Компилятор разрешено оценивать это выражение в любом порядке и увеличении b В любое время: все, что идет, пока a как-то получает оригинал ценность b (И никто не волнует, как это «как-то» работает внутри).

Например, компилятор может оценить a = b++ как следующая последовательность элементарных операций

(1) a := b
(2) b := b + 1

или это может оценить это следующим образом

(1) b := b + 1
(2) a = b - 1

Обратите внимание, что в первом случае b на самом деле увеличивается в конце, а во втором случае b сначала увеличивается. Но в обоих случаях a Получает то же правильное значение - исходное значение b, что это должно получить.

Но я должен повторить, что вышеупомянутые два примера здесь просто для иллюстративных целей. На самом деле, выражения любят a = ++b а также a = b++ нет точек последовательности внутри, что означает, что с вашей точки зрения все в этих выражениях происходит одновременно. Отказ Нет «раньше», «после», «сначала», «следующий» или «последний». Такие выражения являются «атомными» в том смысле, что они не могут быть содержаны в последовательности меньших шагов.

Поскольку Андрейт уже отметил, приоритет и ассоциативность не говорят вам о порядке оценки. Они только рассказывают вам о группировке. Например, приоритет - это то, что говорит использовать это a*b+c сгруппирован как (a*b)+c вместо a*(b+c). Отказ Компилятор свободен оценивать a, b а также c В любом порядке он видит в форме с любыми из этих выражений. Ассоциативность говорит вам о группировке, когда у вас есть операторы того же приоритета, чаще всего, те же операторы. Например, это то, что говорит вам, что a-b-c эквивалентно (a-b)-c, нет a-(b-c) (в противном случае указано, вычитание остается ассоциативной ассоциацией).

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

Глядя на ваши конкретные примеры, в a=b++;, результат в основном из определения самого приращения. Пост-приращение дает предыдущее значение переменной, и когда-то до следующей точки последовательности значение этой переменной будет увеличиваться. Предварительная приращение дает значение переменной с приложенным применением. В одном случае, однако, не означает, что переменная должна быть увеличена в каком-либо конкретном порядке относительно назначения. Например, в приведении предварительного приращения компилятор полностью свободен делать что-то эквивалентное:

temp = b+1;
a = temp;
b = b + 1;

Аналогично, в версии после приращения, переменная может быть увеличена до или после назначения:

a = b;
b = b + 1;

или:

temp = b;
b = b + 1;
a = temp;

Однако в любом случае значение, назначенное a должно быть значение b прежде чем он увеличивается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top