C Объяснение оператора приращения

При выполнении этой части команды C вывод num равен 7. Я ожидал, что это будет 6, может ли кто-нибудь объяснить, почему и как получается 7?

#include <stdio.h>

int main() {
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i = 0, num = 0;
    num = a[++i + a[++i]] + a[++i];
    printf("%d ", i);
    printf("%d ", num);
    return 0;
}

person Shuvam Nandi    schedule 17.02.2017    source источник
comment
Это неопределенное поведение - вы не можете дважды изменять одну и ту же переменную в одной и той же операции.   -  person yeputons    schedule 17.02.2017
comment
Разве вы не задавали тот же вопрос в тот же час? (Конечно, на этот раз вы сформулировали это намного лучше. :) )   -  person synchronizer    schedule 17.02.2017


Ответы (4)


Это немного сложно, выражение: a[++i+a[++i]] включает в себя увеличение переменной i два раза и получается a[i + 2 + a[i + 2]], что равно a[0 + 2 + a[2]] = a[4] = 4, а второй операнд, a[++i], становится a[3], что равно 3, следовательно, окончательный ответ — 7. Другими словами, это поведение undefined.

person Jarvis    schedule 17.02.2017

i увеличивается 3 раза в одном и том же выражении в num = a[++i + a[++i]] + a[++i];

Это имеет неопределенное поведение в C. Это спорный вопрос, пытаясь объяснить, почему он выводит 7 или 6 или что-то еще. Неопределенное поведение может быть любым.

person chqrlie    schedule 17.02.2017

llvm в OS X дает мне 6 и предупреждение:

wi.c:5:8: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]

что предполагает, что мы смотрим на неопределенное поведение. Точная природа того, что здесь undefined, мне пока не ясна, но кажется немного неуместной.

person MK.    schedule 17.02.2017
comment
Этот ответ SO объясняет и предоставляет ссылки, почему это поведение undefined и его следует избегать. - person yeniv; 17.02.2017

i = 0;
num = a[ ++i + a[++i]] + a[++i]

Будет оценивать

num = a[1+ a[2]] + a[3]
num = a[1 + 2] + a[3]
num = a[3] + a[3]
num = 3 + 3
num = 6
person anshuman    schedule 17.02.2017
comment
@Антти Хаапала Как же так? - person anshuman; 17.02.2017
comment
Смотрите повторяющийся вопрос и ответ на него. - person Antti Haapala; 17.02.2017
comment
@ Антти Хаапала Да, ты прав. Спасибо - person anshuman; 17.02.2017