Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2009, 18:55   #11
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

2Somebody

a[i] ^= a[j] ^= a[i] ^= a[j]
сначала a[i] ксорится с a[j], результат записывается в a[i]. затем а[j] ксорится с этим новым a[i], результат пишется в a[j]. После чего этот новый а[j] ксорится с относительно новым a[i], результат записывается в a[i]. Всё правильно и никаких "вдруг" тут быть не может
netrino вне форума Ответить с цитированием
Старый 14.09.2009, 20:18   #12
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
2Somebody

a[i] ^= a[j] ^= a[i] ^= a[j]
сначала a[i] ксорится с a[j], результат записывается в a[i]. затем а[j] ксорится с этим новым a[i], результат пишется в a[j]. После чего этот новый а[j] ксорится с относительно новым a[i], результат записывается в a[i]. Всё правильно и никаких "вдруг" тут быть не может
http://www.open-std.org/jtc1/sc22/op...ntro.execution
Цитата:
Accessing an object designated by a volatile lvalue (_basic.lval_),
modifying an object, calling a library I/O function, or calling a
function that does any of those operations are all side effects, which
are changes in the state of the execution environment. Evaluation of
an expression might produce side effects. At certain specified points
in the execution sequence called sequence points, all side effects of
previous evaluations shall be complete and no side effects of subse-
quent evaluations shall have taken place.
Запись результата - это modifying an object, что есть side effect, который завершается только на ближайшей sequence point.
Если не так, то как?

Последний раз редактировалось Somebody; 14.09.2009 в 20:20.
Somebody вне форума Ответить с цитированием
Старый 14.09.2009, 20:31   #13
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Всё это не значит, что операции будут выполняться в случайном порядке)) В C++ разбор происходит справа налево, то есть запись
Код:
a[i] ^= a[j] ^= a[i] ^= a[j]
эквивалентна
Код:
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
что в свою очередь преобразуется в определённую и предугадываемую последовательность инструкций процессора. Неоднозначности в данном случае быть не может
netrino вне форума Ответить с цитированием
Старый 14.09.2009, 20:42   #14
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Всё это не значит, что операции будут выполняться в случайном порядке)) В C++ разбор происходит справа налево, то есть запись
Код:
a[i] ^= a[j] ^= a[i] ^= a[j]
эквивалентна
Код:
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
Так выполнение операции (то есть вычисление её результата) и модификация объекта - это разные вещи. Эти записи отличаются тем, что во второй добавлены две точки следования.
В общем, ждём какого-нибудь знатока стандартов...
Somebody вне форума Ответить с цитированием
Старый 14.09.2009, 20:59   #15
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Да в любом случае, как в первом, так и во втором случае, в результате мы получим что-то вроде следующего:
Код:
    mov eax, a[i]
    mov ebx, a[j]
    xor eax, ebx
    xor ebx, eax
    xor eax, ebx
    mov a[i], eax
    mov a[j], ebx
какие неоднозначности здесь могут быть?
netrino вне форума Ответить с цитированием
Старый 14.09.2009, 21:57   #16
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Да в любом случае, как в первом, так и во втором случае, в результате мы получим что-то вроде следующего:
Код:
    mov eax, a[i]
    mov ebx, a[j]
    xor eax, ebx
    xor ebx, eax
    xor eax, ebx
    mov a[i], eax
    mov a[j], ebx
какие неоднозначности здесь могут быть?
Здесь уже неоднозначностей нет. Они на этапе компиляции. Я даже почти уверен, что это будет работать со всеми компиляторами. Но не обязано по стандарту - вот в чём проблема.
Somebody вне форума Ответить с цитированием
Старый 14.09.2009, 22:24   #17
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Здесь уже неоднозначностей нет. Они на этапе компиляции. Я даже почти уверен, что это будет работать со всеми компиляторами. Но не обязано по стандарту - вот в чём проблема.
в
Код:
a[i] ^= a[j] ^= a[i] ^= a[j];
порядок выполнения определён, значения i,j не меняются в ходе выполнения
Level Operator Description Grouping
17 = *= /= %= += -= >>= <<= &= ^= |= assignment Right-to-left
cplusplus.com
там внизу описаны приоритеты и порядок выполнения операторов. По стандарту выражение должно преобразоваться в вышеприведённую мною последовательность инструкций процессора(я имею ввиду порядок следования)

Последний раз редактировалось netrino; 14.09.2009 в 23:05.
netrino вне форума Ответить с цитированием
Старый 14.09.2009, 23:08   #18
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Но в ссылке, которую Вы привели, исходя из заголовка(Program execution) речь идёт как раз не об этапе компиляции, но об этапе выполнения скомпилированной программы на недетерминированной машине. ПК, если мне не изменяет память относится к классу детерминированных машин))
С этой терминологией я уже начинаю немного запутываться. Я понимаю это так:
Раздел Program execution говорит, как должна будет выполняться программа, а это зависит от того, в какой набор инструкций она будет скомпилирована. Машина недетерминированная - в этом и проблема. Вот в этом примере можно записать сначала результат левого ^=, потом правого, либо наоборот. Но компилятор в связи с тем, что ПК - детерминированная машина, и согласно
Цитата:
In particular, they need not copy or emulate the struc-
ture of the abstract machine. Rather, conforming implementations are
required to emulate (only) the observable behavior of the abstract
machine as explained below.
должен выбрать один из этих вариантов.

Код:
a[i] ^= a[j] ^= a[i] ^= a[j]
Чем не вариант?
; expression right-to-left
mov eax, a[i]
mov edx, a[j]
xor eax, edx
mov ecx, a[j]
xor ecx, eax
mov ebx, a[i]
xor ebx, ecx
; side effects in any order
mov a[i], ebx
mov a[j], ecx
mov a[i], eax
Насчёт же порядка right-to-left при вычислении выражения я ничего и не говорил - всё правильно. Я говорил только про порядок зарершения побочных эффектов.

Последний раз редактировалось Somebody; 14.09.2009 в 23:15.
Somebody вне форума Ответить с цитированием
Старый 14.09.2009, 23:20   #19
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Somebody
Код:
a[i] ^= a[j] ^= a[i] ^= a[j]
Чем не вариант?
mov eax, a[i]
mov edx, a[j]
xor eax, edx
mov ecx, a[j]
xor ecx, eax
mov ebx, a[i]
xor ebx, ecx
mov a[i], ebx
mov a[j], ecx
mov a[i], eax
вот это вряд ли, к стандарту это уже не имеет никакого отношения, больше к оптимизации конкретным компилятором. По стандарту, после вычисления операции исключающее ИЛИ над a[i] и a[j] результат должен быть записан в a[i].
Код:
mov eax, a[i]
xor eax, a[j]
mov a[i], eax
...
да и вряд ли какой-либо из компиляторов так коряво будет оптимизировать программу, что был бы не определён результат элементарных операций) (хотя, не исключено )
netrino вне форума Ответить с цитированием
Старый 15.09.2009, 08:25   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Господа, если ваши способы одинаково хорошо работают тоникакой спор не сможет помочь. Да и не все ли равно, автор судя по всему уже задачу решил, так что закругляйтесь драться.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив Настенька..Блонди Помощь студентам 3 12.06.2009 00:01
массив Настенька..Блонди Общие вопросы Delphi 0 11.06.2009 21:00
массив Castro Паскаль, Turbo Pascal, PascalABC.NET 12 14.05.2009 00:38
Массив =\ ZeroQl Помощь студентам 2 06.03.2009 20:34
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06