отключи оптимизации и увидишь, что он говорит одно и то же. Dagdamor, в том-то и дело, что в некоторых языках этот код равнозначен такому: Код (Text): int i; i= (i=i+1)+(i=i+1); , то биш он просто имеет более высокий приоритет при выполнении. в других же происходит честный вынос инкремента за пределы выражения Код (Text): int i; ++i; ++i; i=i+i .
dark-demon Не понимаю я твоей логики в упор Почему, если компилятор вносит в твое выражение отсебятину (меняет операции местами), это называется "честным выносом инкремента"? Пока что я понял одно: не стоит использовать подобные выражения, если ты хочешь, чтобы твоя программа работала независимо от реализации компилятора. Amian Это я понял, что вместо вычисления "++i + ++i" он по сути вычисляет "++i; ++i; +". Я не понял, почему второе считается эквивалентным первому... Я бы попросил
Логика простая: работать в соответствии с заранее четко определенным списком приоритетов операций. Операции должны выполняться по порядку, начиная с самой важной. Для изменения порядка операций есть такая штука как скобки. Приоритет операций для того и придумали, чтобы неоднозначностей не возникало. А то, что делает PHP - баг.
AlexGousev Ну хорошо, давай отталкиваться от приоритета. Выражение такое: (++i) + (++i) 1. Выполняется операция в первой скобке. Т.к. она является частью выражения, она возвращает результат (6). i = 6. 2. Выполняется операция во второй скобке. Ее результат - 7 (i равно 7). 3. Полученные результаты складываются, результат всего выражения 13. Верно?
Неа: 1. Выполняется инкремент переменной i 2. Выполняется инкремент переменной i 3. Присваивается значение переменной i первой скобке 4. Присваивается значение переменной i второй скобке 5. Складываются значения первой и второй скобок Хитрость в том, что операция ++i имеет больший приоритет, чем операция присвоения значения, а операция i++ меньший и в этом разница
Полез в документацию посмотреть… В PHP и C операции инкремента разные по сути. В С: Прибавляет единицу к переменной либо до, либо после вычисления всего выражения. В PHP: ++i прибавляет к переменной единицу в момент вычисления текущего куска выражения и возвращает значение. i++, соответственно, сначала возвращает значение, потом прибавляет единицу.
да. в си префиксный инкремент увеличивает значение переменной без копирования значения. это значит, что при вычислении выражения переменная будет равна 7 во всех местах.
Вльдемар Это мы выяснили на предыдущей странице. С этого все и началось… Ты где нибудь в одном выражении два префиксных инкремента когда-нибудь использовал? Я просто не представляю где это можно использовать. Ну и возвращаясь к теме топика:
В математических вычислениях (ряд Тейлора и.т.д.) использую часто... (иногда не получалось "портировать" с РНР на Си с первого раза, видимо это и была причина)
Логика у компа не в "выражениях",а такая: 0 - иницилизируем переменную "int i",под неё выделяется память с адресом 0xFFFF, например. 1- транслятор C расставляет инструкции ассемблера согласно приорететам(inc si,inc si ... mov si ax) 2- выполняется первая операция,происходит обращение к памяти по адресу 0xFFFF,число увеличивается на 1 по этому адресу. 3 - выполняется вторая операция,происходит обращение к памяти по адресу 0xFFFF,число увеличивается на 1 по этому адресу. 4 - выполняется третья операция - сложения 1-го числа с другим и записывается результат.Обрашаемся к левой стороне - адрес 0xFFFF value 0...0111(7 dec),обращаемся к правой стороне - 0xFFFF value 0...0111(7 dec),складываем (7+7=14). 5 - записываем результат в ячейку с адресом 0xFFFF. В PHP происходит абсолютно тоже самое,только в нём есть баг - во время трансляции он скорее всего интерпретирует ++i операцию как i=i+1,не используя инструкцию ассемблера "inc",поэтому и приорететы меняются.И происходит что-нибудь типа: Код (Text): //инкремент на 1 mov ax,si add ax,1 mov si,ax //сложение mov ax,si add ax,si mov si,ax //инкремент на 1 mov ax,si add ax,1 mov si,ax Результат тогда будет: 1)5+1=6 2)6+6=12 3)12+1=13 Извеняюсь если ляпнул чего лишнего,никого не хотел обидеть
dark-demon, самое интересное, что в C++ CLI, в отличие от C#, мы этого не наблюдаем, хотя и то и другое транслируется в MSIL.
Петр, очевидно потому, что это всё-таки C++ пусть и компилируемый в байткод не реальной, а виртуальной машины...