На чём проверял ? У меня 14 получилось... (хотя я тоже ожидал что будет 13) P.S. - я не 40-летний, я 26-ти летний
Javascript - 13 C++ - 14 очевидно скриптовые языки обрабатывают ++i не так как компилируемые. скриптовые: вычисляют выражение и если встречают i++ - откладывают это действие на потом. компилируемые: смотрят, есть ли ++i и сначала выполняют их, а потом уже вычисляют выражение.
Гы. MS VS command prompt, C++ ---- 14 ???? Давайте отдельный топик стартанем? Будем думать. 2dark-demon С# компилируется... Более того даже в скриптовых языках префиксная форма ++ имеет больший приоритет, чем суффиксная или постфиксная, если угодно.
Все точно. Смотрите. Какая-то фигня. Мы когда последним действием складываем переменные, то в обеих в них уже все равно 7. А не 6 и 7. Тогда че за фигня в PHP, C# и JS?
Самое интересное, что PHP: <?php $i = 5; echo (++$i)+(++$i); ?> тоже выдает 13. У меня нарисовалось только такое объяснение: Как работает скриптовый язык: 1. Вычисляем первое выражение ++$i, получаем: 6+(++$i), $i=6; 2. Вычисляем второе выражение ++$i, получаем: 6+7; 3. Складываем, получаем: 13 Как работает компилируемый язык: Допустим, адрес переменной i 0xF4 (не суть) 1. Вычисляем первое выражение, получаем: значение по адресу 0xF4+i, i=6 2. Вычисляем второе выражение, получаем: значение по адресу 0xF4+значение по адресу 0xF4, i=7 3. Складываем, получаем: 14. Т.е. разница в понятии "переменная".
AlexGousev +1, ты настоящий сороколетний одмин. Только получается, что в С# аналогичное истолкование понятия "переменная", как в скриптовом языке. Давайте немножко погрузимся в то, как работает С#, чтобы отпали иллюзии на тему его компиляции и интерпретации: все, что написано на базе .NET Framework переводится в MSIL (MS Intermediate Language), затем компилируется в машинный код на самой машине (при наличии .NET Frmwrk), помещается в GAC(Global Assembly Cash) и при последующих запусках берется именно оттуда => так прикинуть тоже аля скриптовый. Что имеем? А что имеем, то и имеем. UPD:: На C++ CLI получается 14. Тогда точно фигня. C++ CLI базируется на .NET Framework [C#] static void Main(string[] args) { int i = 5; Console.WriteLine(++i + ++i); } [/C#] 13 [C++ CLI] int main(array<System::String ^> ^args) { int i = 5; Console::WriteLine(++i + ++i); return 0; } [/C++ CLI] выводит 14 [C++] void main() { int i = 5; cout << ++i + ++i; } [/C++] 14
Вобще-то складываться должны не переменна $i (которая в конце 7) сама с собой, а результаты двух выражений. Скорее всего, она будет в стеке или регистре.
а как вам это? =) Код (Text): $ cat a.pl #!/usr/bin/perl $i = 5; $i = ++$i + ++$i; print $i; $ ./a.pl 14
AlexGousev, разве я не то же самое сказал? Петр, ну да, и пхп с явой компилируемые, однако это не отменяет их скриптовую природу vasa_c, дебагер показывает, что следующие два куска кода идентичны: Код (Text): int o = 5; o = ++o + ++o; Код (Text): int u = 5; ++u; ++u; u = u+u; как я, собствено, и говорил.
Кстати компилятор Си вот что говорит Код (Text): ; ; int i = 5; ; mov si,5 ; ; i = ++i + ++i; ; inc si inc si mov ax,si add ax,si mov si,ax (c) 1990 Borland Turbo C++ Version 1.01 В свою очередь следующая конструкция Код (Text): double a = 0, b = 1; while (b < 2147483647) a = a + (1 / (b += 2)) - (1 / (b += 2)); работает одинаково и на Си и на JavaScript (только условие в while желательно поменьше поставить, а то "задолбаетесь" джать) PS где модераторы, надо выделить это обсуждение в отдельный топик[/code]
Петр А это как понять по-твоему? Код (Text): inc si inc si mov ax,si add ax,si mov si,ax Сначала выполняется инструкция инцрементации v C++,поэтому и получается 14.Видимо Php и т.д. трактуют ++i не как отдельную инструкцию,а как операцию i=i+1,отсюда и результат. Хотя странно,написано 1,а происходит совсем другое: http://www.php.net/manual/ru/language.operators.php В PHP тоже должно быть 14 >.< Bug ?
Петр Мы складываем не переменные, а выражения. Результатом первого выражения никак не может быть 7 хотя бы потому, что изначально i было равно 5 В данном случае глючат языки, возвращающие 14, а происходит это потому, что они используют один и тот же регистр для хранения переменной из разных контекстов. Попробуйте в настройках компилятора отключить низкоуровневую оптимизацию и посмотреть, какие будут результаты. P.S. А еще попробуйте выражение ++i + ++i + ++i + ... (и так далее, допустим всего штук 10) что-то мне подсказывает, что начиная с определенного момента у оптимизатора не хватит мозгов все это оптимизировать и результат начнет совпадать со здравым смыслом
Dagdamor Посмотри еще раз как эта операция выглядит на ассемблере после трансляции C++: Код (Text): inc si //инкрементация inc si //инкрементация mov ax,si //записываем данные в акамулятор(регистр) add ax,si //сложение mov si,ax //записываем результат из акамулятора в то же самый адрес откуда все время и брали эту переменную,он не изменился. Тут какраз всё правильно т.к. согласно таблице приорететов должна сначала выполняться инструкция инкрементации,поэтому и результат будет 14. Может! Переменная хранится всё время в 1 месте.Распишу как это происходит: 1- согласно таблице приоритетов сначала выполняется первая инкрементация,результат записывается на место старого. //5+1=6 2 - выполняется вторая инкрементация,результат записывается на место старого.6+1=7 3 - производится сложение 1-ой и той же переменной с 1м и тем же адресом самой с собой и записывается опять таки в то же самое старое место! //7+7=14 Бррр ... сразу видно что на C/C++ или ассемблере ты не програмировал Что значит "разные контексты" ? Програма выделяет память под переменную с определённым адресом и он не меняется.И операции с регистрами тут уж точно никаким боком не стоят т.к. перед выполнением регистровых операций данные загружаются в регистр из памяти ,регистры не используются для хранения данных