<none>
- From
- Andrey Tarasevich ()
- To
- Mike Murov
- Date
- 2002-10-03T03:01:09Z
- Area
- RU.ALGORITHMS
From: "Andrey Tarasevich" <atarasevich@telocity.com>
Wed Oct 02 2002 16:07, Mike Murov wrote to Serge Nozhenko:
>>>> AT> Итак, _вычислением_ выражения 'a ^= b' в C/C++ называется
>>>> AT> процесс вычисления значения 'a ^ b'. Ни больше, ни меньше.
>>>> AT> Величина 'a ^ b' называется _результатом_ выражения 'a ^= b'.
>>>> AT> Все. Больше ничего в _результат_ выражения 'a ^= b' не
>>>> AT> входит.
>>>>
>>>> [...дальнейшие рассуждения поскипаны...]
MM> <skip here appear>
MM> Уважаемые господа!
MM> К сожалению не имею времени работать с оригинальным C++ стандартом и
MM> пользуюсь выжимками от Microsoft (MSDN, April 2000). Так вот, по
MM> исследуемому вопросу там сказано следующее:
MM> Assignment Operators: =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=
MM> An assignment operation assigns the value of the right-hand operand to
MM> the storage location named by the left-hand operand. Therefore, the
MM> left-hand operand of an assignment operation must be a modifiable
MM> l-value. After the assignment, an assignment expression has the value of
MM> the left operand but is not an l-value. The assignment-operator is one of
MM> the following: <skipped>
Очевидно, что это раздел был написан человеком, который неправильно
проинтерпретировал требования спецификации языка. В этом тексте явно
декларируется временнОе ограничение на момент возникновения побочного эффекта
встроенного оператора присваивания. Спецификации языков С и С++ такого
ограничения не делают.
Что интересно, это раздел в MSDN служит одновременно описанием "спецификации"
этих операторов и для С и для С++. Как С++ описание, он содержит грубую ошибку
- в языке С++ результат любого из вышеперечисланных встроенных операторов
присваивания _является_ _Lvalue_. А в цитате сказано, что не является.
int a;
int* p = &(a = 5); // легально в С++, нелегально в С
MM> Так вот, насколько я понимаю <start> assign the value <skip> to the
MM> storage location named <end> довольно явно указывает на принудительную
MM> прямую модификацию памяти, которая же будет являтся и значением
MM> выражения. Причем для всей группы операторов присвоение является не
MM> каким-то доп.эффектом, а самым что ни на есть основным.
В С/С++ у операторов и выражений нет никаких "основных эффектов". У операторов
и выражений есть результаты и побочные эффекты. Все. Если вычисление какого-то
выражения приводит к тому, что один из его операндов меняется - это, по
определению, называется побочным эффектом. Моменты выполнения побочных
эффектов в языках С и С++ определены с точностью до "где-то между парой
соседених точек следования". Нигде и никогда ни С ни С++ более строгих
требований на моменты выполнения побочных эффектов не накладывается.
В этом заключается сама идея точек следования, на которой держится весь
процесс выполнения программы в С/С++. Когда процесс выполнения программы
проходит через точку следования, гарантируется, что все предыдущие действия
уже завершены, и ни одно последующее действие еще не начато. А пока программа
находится между двух точек следования, нет и быть не может никаких гарантий о
том, что уже сделано, а что еще нет.
Best regards,
Андрей.
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)