Имя пользователя:
Пароль:
 

Название темы: Сумма трех байт
Показать сообщение отдельно

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Тут дело в том, что порядок выполнения операций между точками следования не определён. Из фака su.c_cpp:
Цитата:
[pre]>> 036. k[++j] = k[j-- - 1] + k[++j]; Как это считается?
> Q: Отгадай загадку, All. Как будет выглядеть массив k после:
>
>      int k[] = { 0, 1, 2, 3, 4, 5 };
>      int j = 2;
>
>      k[++j] = k[j-- - 1] + k[++j];
>
>    Проверил на трех компиляторах - MSVC++ 6.0 SP3, BC 3.1,
>    Watcom 11.0 - и в C и в C++ режимах. Ответы разные у всех компиляторов!

A: (Serge A. Rider) - 30.10.1999

    Лень глядеть в стандарт, но вот из Страуструпа:
-------------------------------
6.2.2 Evaluation Order
The order of evaluation of subexpressions within an expression is
undefined. In particular, you cannot assume that the expression is
evaluated left to right.
-------------------------------

Короче говоря, в твоем варианте операции ++j, j-- и ++j могут
выполняться в любой последовательности - как захочется компилятору -
со всеми вытекающими. Исключение составляют только ",", && и || - они
всегдя слева направо.

(Hе только эти. Есть еще тернарная операция `?:'. -- Ivan Kosarev (31.10.99))

В общем, перепиши свое выражение, чтобы оно не зависело от порядка
вычисления подвыражений.
[/pre]
Добавлено:

Кстати, так тоже нельзя писать:
Код: Выделить весь код
char buf[] = {1,4,16};
char * p = buf-1;
Т.е. нельзя ничего вычитать из адреса нулевого элемента массива. Это тоже может привести к гипотетическим граблям на некоторых архитектурах. (Например на x86 не в pmode, если у тебя массив лежит в самом начале сегмента, то будут проблемы).

-------
http://ivank.ru


Отправлено: 17:29, 25-09-2003 | #5

Название темы: Сумма трех байт