Из раздела ISO / IEC 9899: 201x 5.1.2.3 Выполнение программы параграфа 2:
Доступ к изменчивому объекту, изменение объекта, изменение файла или вызов функции, которая выполняет любую из этих операций, - все это побочные эффекты, которые представляют собой изменения в состоянии среды выполнения. Оценка выражения в целом включает в себя как вычисление значений, так и инициирование побочных эффектов. Вычисление значения для выражения lvalue включает определение идентичности обозначенного объекта.
В абзаце говорится, что «изменение объекта» - это побочный эффект. Это означает, что следующий код:
int x;
x = 1;
имеет побочный эффект - x = 1
, поскольку он изменяет объект x
.
Однако согласно wikibooks по программированию на C:
В C и, в более общем смысле, в информатике говорят, что функция или выражение имеют побочный эффект, если они изменяют состояние вне своей области видимости или имеют наблюдаемое взаимодействие с вызывающими функциями или внешним миром. По соглашению возврат значения влияет на вызывающую функцию, но обычно это не считается побочным эффектом.
Некоторые побочные эффекты:
- Модификация глобальной переменной или статической переменной
- Модификация аргументов функции
- Запись данных на дисплей или в файл
- Чтение данных
- Вызов других побочных функций
Итак, кто прав? x = 1
действительно побочный эффект? даже если он ничего не меняет за пределами своей области? или я неправильно истолковал стандарт?
x = 1
равно 1; его побочный эффект - присвоение 1 переменной x. Вы можете использовать значение в более крупном выражении (y = 4 - (x = 1)
), но вы не можете зависеть от порядка выполнения побочных эффектов (y = (x = 4) + (x = 2); /* y == 6; x == ?? */
) - person pmg   schedule 04.04.2019