Как будут обрабатываться операнды внутри (a + = 3, 5, a), чтобы напечатать значение "a"?

Фрагмент кода:

int main()
{
     int a = 1, b = 2, c = 3;
     printf("%d", a += (a += 3, 5, a));
}

Хотя он отображает 8 в терминале в качестве выхода. Но я не понимаю концепцию.

Ответы

Ответ 1

Это эффект работы оператора запятой, последний элемент - тот, который используется как значение оператора. Таким образом, вы получили следующее:

a += (a += 3, 5, a)

Сначала оценивается a+=3, это делает a=4, этот результат отбрасывается, затем оценивает 5, тогда этот результат отбрасывается, затем оценивает a и сохраняет его как последний элемент. Результатом (a += 3, 5, a) является последний элемент, который равен 4.

Затем вы получаете

a += 4

поэтому a 8.

Важное примечание: это артефакт того, как ваш компилятор сгенерировал код. Стандарт C не гарантирует порядок выполнения для назначения a в этой ситуации. См. Ответ haccks для получения дополнительной информации об этом.

Ответ 2

Выражение a += (a += 3, 5, a) будет вызывать поведение undefined.

Стандарт C говорит

C11: 6.5.16 Операторы присваивания (p3):

[...] Побочным эффектом обновления сохраненного значения левого операнда является упорядочивается после вычисления значений левого и правого операндов. Оценки операндов не зависят от.

Не гарантируется, будет ли левая часть a оценена до или после оценки (a += 3, 5, a). Это приведет к поведению undefined.