является ли присвоение локальной переменной побочным эффектом?

Из раздела ISO / IEC 9899: 201x 5.1.2.3 Выполнение программы параграфа 2:

Доступ к изменчивому объекту, изменение объекта, изменение файла или вызов функции, которая выполняет любую из этих операций, - все это побочные эффекты, которые представляют собой изменения в состоянии среды выполнения. Оценка выражения в целом включает в себя как вычисление значений, так и инициирование побочных эффектов. Вычисление значения для выражения lvalue включает определение идентичности обозначенного объекта.

В абзаце говорится, что «изменение объекта» - это побочный эффект. Это означает, что следующий код:

int x; 
x = 1;

имеет побочный эффект - x = 1, поскольку он изменяет объект x.

Однако согласно wikibooks по программированию на C:

В C и, в более общем смысле, в информатике говорят, что функция или выражение имеют побочный эффект, если они изменяют состояние вне своей области видимости или имеют наблюдаемое взаимодействие с вызывающими функциями или внешним миром. По соглашению возврат значения влияет на вызывающую функцию, но обычно это не считается побочным эффектом.

Некоторые побочные эффекты:

  • Модификация глобальной переменной или статической переменной
  • Модификация аргументов функции
  • Запись данных на дисплей или в файл
  • Чтение данных
  • Вызов других побочных функций

Итак, кто прав? x = 1 действительно побочный эффект? даже если он ничего не меняет за пределами своей области? или я неправильно истолковал стандарт?


person user2162550    schedule 04.04.2019    source источник
comment
Я думаю, что вики запутались и используют термин «побочные эффекты» для обозначения неоптимизируемых / видимых извне побочных эффектов. Как говорит Эрик Постпишил в представленной вами ссылке, результат оценки выражения является основным эффектом. Все записи, непостоянные чтения и системные вызовы, которые происходят во время оценки, являются побочными эффектами, некоторые записи (или вызывающие их вызовы функций) теоретически могут быть исключены согласно правилу «как если бы».   -  person PSkocik    schedule 04.04.2019
comment
Каждое выражение имеет значение (кроме выражений void) и 0 или более побочных эффектов. Значение выражения x = 1 равно 1; его побочный эффект - присвоение 1 переменной x. Вы можете использовать значение в более крупном выражении (y = 4 - (x = 1)), но вы не можете зависеть от порядка выполнения побочных эффектов (y = (x = 4) + (x = 2); /* y == 6; x == ?? */)   -  person pmg    schedule 04.04.2019
comment
@mpg - отличное объяснение, теперь оно имеет смысл.   -  person user2162550    schedule 04.04.2019
comment
Ответ StoryTeller правильный, но я добавлю, что статья в Викиучебниках дает другое определение побочного эффекта , и то, что в нем говорится об этих побочных эффектах, может быть правильным, но это другое использование этого термина. То есть, это не неправильно (потому что людям разрешено использовать свои собственные определения для терминов; стандарт C не имеет права требовать иное), но он должен был прояснить, что он использовал какое-то определение, отличное от C. Примечательно, что в статье неверно сказано «В C.»   -  person Eric Postpischil    schedule 04.04.2019


Ответы (4)


Итак, кто прав?

Когда доходит до определений в стандарте, это стандарт.

x = 1 действительно побочный эффект? даже если он ничего не меняет за пределами своей области?

Да, стандартный абзац, который вы процитировали, говорит об этом.

или я неправильно истолковал стандарт?

Вы правильно поняли и применили стандартный абзац к x = 1. Но вы ошибались, пытаясь применить к стандартному тексту внешнее разговорное определение. Стандарт C не предназначен для обучения кого-либо C. Это формальный документ, единственная цель которого - определить, как абстрактная машина C выполняет переведенную программу. С этой целью он определяет множество понятий и терминов. Вот и все. При обращении к этим терминам для определения предполагаемого поведения программы на языке C применяется только стандартное определение.

С другой стороны, книга действительно направлена ​​на то, чтобы научить вас C. Ее цель - дать вам "почувствовать", как ведет себя программа на C. Но с этой целью он вполне может использовать разговорные выражения и неточный язык, чего и следовало ожидать. Не оставляйте книгу без внимания, если на нее есть хорошие отзывы, но помните, что это не нормативная ссылка, в отличие от стандартной.

person StoryTeller - Unslander Monica    schedule 04.04.2019

Подобного рода путаница возникает, когда книги C принимают термины, используемые в стандарте C (например, побочный эффект), и переопределяют их.

побочный эффект в C в точности соответствует определению этого абзаца стандарта.

И да, x = 1, следовательно, является побочным эффектом.

Другой вопрос, выполняет ли правило как будто задание. Может быть, в книге было бы лучше использовать термин наблюдаемый эффект?

person Bathsheba    schedule 04.04.2019

Обе ваши цитаты включают определение побочного эффекта:

C Стандарт:

которые являются изменениями в состоянии среды выполнения

C Викибук:

если он изменяет состояние за пределами своей области видимости или имеет наблюдаемое взаимодействие с вызывающими функциями или внешним миром.

Они определяют разные вещи и, следовательно, путаницу. Хотя x = 1 является побочным эффектом (стандарт C), это не побочный эффект (C Wikibook). Определение C Wikibooks в стандарте C называется наблюдаемым эффектом.

person Goswin von Brederlow    schedule 04.04.2019

Стандарт C имеет тенденцию давать расплывчатые и неполные определения терминов, которые не прилагают особых усилий для исключения всего, к чему этот термин не применяется. Например, черновик C11 определяет объект как «область хранения данных в среде исполнения, содержимое которой может представлять значения». Это было бы аналогично определению «автомобиля» как «моторизованного транспортного средства, которое может перевозить людей». Такое определение может быть хорошим для того, чтобы отличить машину от лошади, но не для того, чтобы отличить машину от автобуса, пикапа или автофургона.

Понятие «побочный эффект», как обычно используется, охватывает понятие чего-то вне непосредственной области действия операции, и такое понятие будет согласовано с тем, как Стандарт фактически использует этот термин, если кто-то признает что для целей оценки выражения или подвыражения «объем» этой операции будет ограничен результатом этой операции или вещами, время жизни которых привязано к его оценке. Однако, если бы Стандарт попытался ограничить термин «побочный эффект» таким образом, ему пришлось бы затем определить «объем», к которому относились побочные эффекты. Вместо того, чтобы делать это, авторы Стандарта просто использовали более широкое определение и полагались на читателей, чтобы ограничить применение теми местами, где это имело бы смысл.

person supercat    schedule 04.04.2019