какая сторона выражения вычисляется первой? - PullRequest
2 голосов
/ 20 сентября 2010

Будет ли вычисляться правая часть выражения первой или левая?

void main ()
{
    int i = 0 , a[3] ;
    a[i] = i++;
    printf ("%d",a[i]) ;
}

Ответы [ 2 ]

16 голосов
/ 20 сентября 2010

Порядок вычисления операндов оператора присваивания не указан: операнды могут оцениваться в любом порядке.

Однако это выражение (a[i] = i++) приводит к неопределенному поведению, поскольку вы оба изменяете i (используя i++) и отдельно читаете i (используя a[i]) без точки последовательности между этими действиями.

3 голосов
/ 20 сентября 2010

C не определяет, какая сторона будет оценена первой. Стандарт гласит (C99 §6.5 / 2):

Между предыдущей и следующей последовательностью указать объект должен храниться значение, измененное не более одного раза оценка выражения. Кроме того, предыдущее значение должно быть доступ только для определения значения храниться

Вышеупомянутый результат, который вы опубликовали, UB.

...