является ли назначение локальной переменной побочным эффектом - PullRequest
3 голосов
/ 04 апреля 2019

С ИСО / МЭК 9899: 201x сечение 5.1.2.3 Выполнение программы абзац 2 :

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

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

int x; 
x = 1;

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

Однако, согласно вики-книг on Программирование на C :

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 04 апреля 2019

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

Когда речь идет об определениях в стандарте, это стандарт.

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

Да, стандартный абзац, который вы цитировали, сказал так же.

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

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

Книга с другой стороны действительно направлена ​​на то, чтобы научить вас C. Цель этой программы - дать вам «почувствовать», как ведет себя программа на Си. Но для этого он вполне может использовать разговорные выражения и неточный язык, чего и следовало ожидать. Вы не должны игнорировать книгу, если она имеет хорошие отзывы, но имейте в виду, что она не является нормативной ссылкой, в отличие от стандартной.

3 голосов
/ 04 апреля 2019

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

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

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

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

1 голос
/ 04 апреля 2019

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

C Стандарт:

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

C Wikibook:

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

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

0 голосов
/ 04 апреля 2019

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

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

...