Из стандарта С++ (С++ 11), §1.9.15, который обсуждает порядок оценки, приведен следующий пример кода:
void g(int i, int* v) {
i = v[i++]; // the behavior is undefined
}
Как отмечено в образце кода, поведение undefined.
(Примечание. Ответ на другой вопрос с немного другой конструкцией i + i++
, Почему это = я + я ++ undefined и не неопределенное поведение, может примените здесь: Ответ по существу состоит в том, что поведение undefined по историческим причинам, а не по необходимости. Однако стандарт, по-видимому, подразумевает некоторое обоснование для этого существа undefined - см. цитату сразу же. Кроме того, этот связанный вопрос указывает на то, что поведение должно быть неуказанным, тогда как в этом вопросе я спрашиваю, почему поведение плохо определено.)
Обоснование, данное стандартом для поведения undefined, выглядит следующим образом:
Если побочный эффект скалярного объекта не зависит от другой побочный эффект на том же скалярном объекте или вычисление значения используя значение одного и того же скалярного объекта, поведение undefined.
В этом примере я бы подумал, что подвыражение i++
будет полностью оценено до того, как будет оценено подвыражение v[...]
, и что результат оценки подвыражения будет i
(до приращения), но что значение i
является добавочным значением после полной оценки подвыражения. Я бы подумал, что в этот момент (после того, как подвыражение i++
было полностью оценено), выполняется оценка v[...]
, за которой следует присваивание i = ...
.
Поэтому, хотя приращение i
бессмысленно, я все же думаю, что это должно быть определено.
Почему это поведение undefined?