2016-02-21 4 views
-4

Я читаю материал C ошибка и он сказал, что:Неопределенный порядок побочных эффектов

В самом одном выражении, мы не можем, конечно, угадать порядок побочных эффектов. Как и в следующей части кода, в зависимости от компилятор, который используется, я/++ может быть либо 0 или 1

... 
int i = 1; 
int ii = i /++ i ; 
... 

Не могли бы вы сказать мне причину?

Это сообщение имеет близко проблема Why does the expression a = a + b - (b = a) give a sequence point warning in c++?

+0

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

+0

нет, есть 3 оператора полностью, '=' и '/' и '++' – Nik

+0

Пространство между ++ и i опечатка? или что было намеренно добавлено? –

ответ

1

Оператор старшинство о том, чтобы дерево, и это не повлияет на порядок оценки.

Дерево должно выглядеть как ((ii) = ((i)/(++(i)))) в каждом компиляторе.

С другой стороны, оценочный заказ неуказан, поэтому мы не можем определить, какая из левых рук i и правая рука ++i оценивается ранее. Если первое оценивается первым, выражение будет 1/2, но если последнее сначала оценивается, выражение будет 2/2.

N1256 6.5 Выражения

2 Между предыдущей и следующей точкой последовательности объект должен иметь хранимую в нем величину модифицированного не более одного раза в вычислении выражения. 72) Кроме того, предыдущий номер должен быть считан только для определения значения, которое необходимо сохранить. 73)
3 Группировка операторов и операндов обозначается синтаксисом. 74) За исключением указанных ниже (для функции-call(), & &, ||,?: И запятые) порядок оценки подвыражений и порядок, в котором происходят побочные эффекты, не определены.

+2

Это неопределенное поведение * - возможные результаты не ограничиваются двумя указанными вами случаями –

Смежные вопросы