|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrey Tarasevich 2:5020/400 03 Oct 2002 03:01:09 To : Mike Murov Subject : <none> -------------------------------------------------------------------------------- Wed Oct 02 2002 16:07, Mike Murov wrote to Serge Nozhenko: >>>> AT> Итак, _вычислением_ выражения 'a ^= b' в C/C++ называется >>>> AT> процесс вычисления значения 'a ^ b'. Hи больше, ни меньше. >>>> 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> каким-то доп.эффектом, а самым что ни на есть основным. В С/С++ у операторов и выражений нет никаких "основных эффектов". У операторов и выражений есть результаты и побочные эффекты. Все. Если вычисление какого-то выражения приводит к тому, что один из его операндов меняется - это, по определению, называется побочным эффектом. Моменты выполнения побочных эффектов в языках С и С++ определены с точностью до "где-то между парой соседених точек следования". Hигде и никогда ни С ни С++ более строгих требований на моменты выполнения побочных эффектов не накладывается. В этом заключается сама идея точек следования, на которой держится весь процесс выполнения программы в С/С++. Когда процесс выполнения программы проходит через точку следования, гарантируется, что все предыдущие действия уже завершены, и ни одно последующее действие еще не начато. А пока программа находится между двух точек следования, нет и быть не может никаких гарантий о том, что уже сделано, а что еще нет. Best regards, Андрей. --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/16679b280a49b.html, оценка из 5, голосов 10
|