2015-06-11 3 views
0

В C, этоВ C, {a [i] = a [++ i]} эквивалентно {a [i] = a [i + 1]; я ++;}?

a[i] = a[++i]; 

эквивалентно

a[i] = a[i+1]; i++; 

То есть, какая сторона задания оценивается первым и какое значение i используется на левой стороне? Или это назначение неоднозначно?

+8

Неопределенное поведение. Не пишите такой код. – Amadan

+0

@Amadan, на самом деле, это не так. Из http://stackoverflow.com/a/3914332/434551, «C++ 03 [раздел 5/4] говорит, что между предыдущей и следующей точкой последовательности скалярный объект должен иметь неизмененное значение хранимого значения не более одного раза путем оценки выражение ». Здесь« i »изменяется только один раз. –

+0

@RSahu: см. [Этот ответ] (http://stackoverflow.com/a/2989841/240443), цитату из K & R, с этим точным примером. Тот факт, что он не нарушает одно ограничение, не означает, что он не может нарушить другой. – Amadan

ответ

3

В той же точке последовательности вы используете и приращение i

a[i] = a[i++]; 

что приведет к непредсказуемому поведению.

a[i] = a[i+1]; 
i++; 

хорошее.

И чтобы ответить на ваш вопрос они такие же? Нет, они не !! Один, если хорошо определен, а другой нет.

answer

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