<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)