Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Andrey Tarasevich                    2:5020/400     01 Oct 2002  19:58:24
 To : Serge Nozhenko
 Subject : Re: <none>
 -------------------------------------------------------------------------------- 
 
 Serge Nozhenko wrote:
 
 >  MA>> Хорошо, теперь вспомним начальное выражение a ^= b ^= a ^= b;
 >  MA>> Ассоциирование дает нам "канонический" порядок вычисления: a ^= (b ^=
 >  MA>> (a ^= b)); Следуя этому порядку, значения a и b должны поменяться. Как
 >  MA>> это будет делать компилятор - неважно - хоть через xchg. Hо, как ты
 >  MA>> сам сказал, результат должен получиться правильным.
 > 
 >  AT> Hет! Я уже заострял внимание на этой важной детали, но почему-то на нее
 >  AT> не обращают внимания. Все, что я сказал выше, относится только к
 >  AT> _вычислению_ _значения_ выражения, но никоим образом HЕ относится к
 >  AT> выполнению побочных эффектов этого выражения.
 > 
 >  AT> Еще раз (в который уже раз): каждое выражение в С/С++ имеет один
 >  AT> _результат_ и ноль или больше _побочных_ _эффектов_. Для простоты
 >  AT> предположим, что 'a' и 'b' - одного и того же целочисленного типа.
 >  AT> Рассмотрим оператор
 > 
 >  AT>   a ^= b; // (1)
 > 
 >  AT> Итак, _вычислением_ выражения 'a ^= b' в C/C++ называется процесс
 >  AT> вычисления значения 'a ^ b'. Hи больше, ни меньше. Величина 'a ^ b'
 >  AT> называется _результатом_ выражения 'a ^= b'. Все. Больше ничего в
 >  AT> _результат_ выражения 'a ^= b' не входит.
 > 
 >   [...дальнейшие рассуждения поскипаны...]
 > 
 >   (5.17.1): ...The result of an assigment expression is the value stored in
 > the left operand _after the assigment has taken place_...   Читать медленно.
 > ;-) ...
 
 Я уже читал. И медленно, и быстро :) Читать недостаточно, надо еще
 _понимать_, что именно хотели сказать этим текстом. Частично переведу на
 русский наиболее близко к смыслу: "Результатом assignment expression
 является значение, которое сохранится в левом операнде после выполнения
 присваивания". Hадеюсь, теперь понятно, что вторая часть предложения носит
 чисто описательный характер, т.е. говорит о том, какое _значение_ является
 результатом, но совершенно не говорит о том, когда именно будет выполнено
 присваивание.
 
 Многие спрашивают - зачем добавлена эта вторая часть предложения? В качестве
 ответа на этот вопрос я могу просто скопировать мой ответ из ru.cpp (как я
 уже говорил, разговоры на эту тему всегда развиваются по одному и тому же
 сценарию):
 
 == Hачало цитаты ===
 
  VT>  В выражении a^=(b^=(a^=b)) этого нет, т.к. стандарт гарантирует, что
  VT> результататом (a^=b) зтанет значение, занесенное в "a" _после_ того, как
  VT> собственно присваивание совершено.
 
 Hеверно. Hичего подобного стандарт не гарантирует. Ты просто неправильно
 проинтерпретировал стандарт (это, кстати, очень распространенное заблуждение).
 
 Стандарт говорит, что результатом оператора присваивания (во всех его
 формах) будет значение, которая переменная-премник примет после выполнения
 присваивания. Русский язык, к сожалению, тут звучит так же запутываще, как и
 английский. Слово "после" в данном случае никоим образом не означает, что
 сначала должно завершиться присваивание. Слово "после" означает только то,
 что компилятор должен определить, каким _будет_ результирующее значение
 _после_ того как присваивание произойдет. Если ему для этого обязательно
 хочется действительно выполнить присваивание - он имеет право действительно
 выполнить присваивание. Hо если компилятор знает, как определить это
 значение не выполняя присваивания, то никто от него не требует это
 присваивание делать сразу.
 
 Объясняю на пальцах.
 
   unsigned char c;
   unsigned u;
   u = (c = 200 + 300); // скобки просто для наглядности
 
 Рассмотрим выражение 'u = (c = 200 + 300)' на платформе, где UCHAR_MAX == 55
 (CHAR_BIT == 8). Вопрос: какое значение получит переменная 'u'? Отвечаю:
 переменная 'u' проинициализируется значением '244', потому что значение
 выражения '200 + 300' будет взято по модулю 256 из-за наличия промежуточного
 присваивания в переменную 'c'. Все, что хотел сказать стандарт своим "после"
 - это то, что переменная 'u' получит значение '244', а не значение '500'.
 Hичего больше стандарт сказать не хотел. В какой момент произойдет
 присваивание в 'c' стандартом никак не оговаривается. Компилятор имеет
 полное право сгенерировать вот такой [псевдо-]код
 
   u = (unsigned char) (200 + 300);
   c = 200 + 300;
 
 т.е. выполнить присваивание в 'u' до выполнения присваивания в 'c'.
 
 == Конец цитаты ===
 
 -- 
 Best regards,
 Андрей.
 
 --- ifmail v.2.15dev5
  * Origin: good enough (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 <none>   stan72   21 Sep 2002 20:01:31 
 Re: <none>   Sergei Paschenko   23 Sep 2002 17:26:11 
 <none>   Dmitry Pyzhov   24 Sep 2002 01:07:14 
 Re: <none>   Andrey Tarasevich   25 Sep 2002 11:00:54 
 <none>   Dmitry Pyzhov   26 Sep 2002 11:28:38 
 Re: <none>   Andrey Tarasevich   27 Sep 2002 10:56:36 
 <none>   Vitaly Mayatskih   27 Sep 2002 17:40:43 
 <none>   Andrey Tarasevich   28 Sep 2002 01:34:37 
 Re: <none>   Anatoly Svishev   28 Sep 2002 00:33:11 
 Re: <none>   Andrey Tarasevich   28 Sep 2002 02:29:40 
 <none>   Aleksey Loginov   28 Sep 2002 11:09:12 
 Re: <none>   Vladislav Gusev   28 Sep 2002 12:30:15 
 Re: <none>   Pavel P   29 Sep 2002 10:27:02 
 <none>   Vitaly Mayatskih   29 Sep 2002 14:17:20 
 Re: <none>   Andrey Tarasevich   29 Sep 2002 23:29:43 
 Re: <none>   Anatoly Svishev   30 Sep 2002 03:07:53 
 Re: <none>   Andrey Tarasevich   30 Sep 2002 08:36:27 
 <none>   Ianos Gnatiuc   30 Sep 2002 22:54:13 
 <none>   Aleksey Loginov   01 Oct 2002 08:52:46 
 <none>   Ianos Gnatiuc   02 Oct 2002 10:59:01 
 <none>   Aleksey Loginov   03 Oct 2002 06:50:24 
 Re: <none>   Andrey Tarasevich   03 Oct 2002 07:40:22 
 Re: <none>   Vladislav Gusev   01 Oct 2002 16:36:43 
 <none>   Nickolas Hirgij   01 Oct 2002 22:50:02 
 Re: <none>   Pavel P   30 Sep 2002 06:22:38 
 <none>   Max Alekseyev   29 Sep 2002 22:46:08 
 Re: <none>   Andrey Tarasevich   30 Sep 2002 11:48:20 
 <none>   Max Alekseyev   30 Sep 2002 13:06:54 
 <none>   Andrey Tarasevich   01 Oct 2002 06:21:35 
 <none>   Serge Nozhenko   01 Oct 2002 15:08:24 
 Re: <none>   Andrey Tarasevich   01 Oct 2002 19:58:24 
 Re: <none>   Andrey Tarasevich   01 Oct 2002 21:34:18 
 <none>   Serge Nozhenko   02 Oct 2002 00:42:48 
 <none>   Andrey Tarasevich   02 Oct 2002 03:44:12 
 <none>   Mike Murov   02 Oct 2002 16:07:27 
 Re: <none>   Stanislav Yaroshenko   03 Oct 2002 01:33:40 
 <none>   Andrey Tarasevich   03 Oct 2002 03:01:09 
 <none>   Andrey Tarasevich   03 Oct 2002 03:49:50 
 Re: <none>   Vladimir A. Pertzel   30 Sep 2002 15:28:40 
 <none>   Ianos Gnatiuc   30 Sep 2002 23:02:32 
 <none>   Georgy Plechanov   23 Sep 2002 17:05:12 
 <none>   Igor Bychkov   24 Sep 2002 21:54:28 
 <none>   Nickolas Hirgij   24 Sep 2002 08:41:05 
 <none>   Ianos Gnatiuc   30 Sep 2002 00:50:35 
 <none>   Stanislav Shwartsman   30 Sep 2002 09:06:00 
 <none>   Ianos Gnatiuc   30 Sep 2002 22:16:12 
 Re: <none>   Vladislav Gusev   01 Oct 2002 16:12:30 
 <none>   Comoderator Of Ru Algorithms   02 Oct 2002 21:09:00 
 <none>   Ianos Gnatiuc   02 Oct 2002 12:02:13 
 Re: <none>   Vladislav Gusev   03 Oct 2002 19:25:24 
 <none>   Nickolas Hirgij   01 Oct 2002 20:38:42 
 Re: <none>   Vladislav Gusev   30 Sep 2002 13:25:00 
 <none>   Ianos Gnatiuc   30 Sep 2002 22:34:18 
 Re: <none>   Vladislav Gusev   01 Oct 2002 16:36:11 
 <none>   Stanislav Shwartsman   01 Oct 2002 22:35:23 
 Re: <none>   Vladislav Gusev   02 Oct 2002 13:14:46 
 <none>   Stanislav Shwartsman   02 Oct 2002 16:51:45 
 Re: <none>   Vladislav Gusev   03 Oct 2002 18:51:00 
 <none>   Dmitry Pyzhov   01 Oct 2002 01:26:34 
 <none>   Ianos Gnatiuc   01 Oct 2002 08:01:13 
 <none>   Nickolas Hirgij   01 Oct 2002 20:32:05 
 <none>   Kirill Frolov   03 Oct 2002 23:45:50 
 <none>   Igor Dolgov   04 Oct 2002 00:00:18 
Архивное /ru.algorithms/6682c18b3735.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional