Ассоциативность оператора в C специфически префикс и постфикс приращение и уменьшение
-
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
прежде чем он увеличивается.