Как будут обрабатываться операнды внутри (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
поэтому a8.
Важное примечание: это артефакт того, как ваш компилятор сгенерировал код. Стандарт C не гарантирует порядок выполнения для назначения a в этой ситуации. См. Ответ haccks для получения дополнительной информации об этом.
Ответ 2
Выражение a += (a += 3, 5, a) будет вызывать поведение undefined.
Стандарт C говорит
C11: 6.5.16 Операторы присваивания (p3):
[...] Побочным эффектом обновления сохраненного значения левого операнда является упорядочивается после вычисления значений левого и правого операндов. Оценки операндов не зависят от.
Не гарантируется, будет ли левая часть a оценена до или после оценки (a += 3, 5, a). Это приведет к поведению undefined.