За последние 24 часа нас посетили 17556 программистов и 1281 робот. Сейчас ищут 1495 программистов ...

Башоргру ЖГЁТ - или сборник лучшего

Тема в разделе "HUMOR.PHP.RU", создана пользователем Psih, 21 мар 2007.

  1. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Че-то последнее время я общительный пацан, люблю поболтать, особенно с классными девченками =)
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ... которые способны ответить на этот вопрос, то естсь с 40-летними одминами :)
     
  3. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Вы на что намекаете?

    "Эта роль ругательная, я попрошу ее ко мне не применять." (ц)
     
  4. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Начался какой-то треш…
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    На чём проверял ?
    У меня 14 получилось... (хотя я тоже ожидал что будет 13)

    P.S. - я не 40-летний, я 26-ти летний :D
     
  6. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    2Vladson
    Проверял по логике, на C# и на PHP.
    13 ответ.
     
  7. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я проверял на Си (компилятор mingw) и там 14

    А на JavaScript 13
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Javascript - 13
    C++ - 14

    очевидно скриптовые языки обрабатывают ++i не так как компилируемые.
    скриптовые: вычисляют выражение и если встречают i++ - откладывают это действие на потом.
    компилируемые: смотрят, есть ли ++i и сначала выполняют их, а потом уже вычисляют выражение.
     
  9. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Гы.
    MS VS command prompt, C++ ---- 14 ????

    Давайте отдельный топик стартанем?
    Будем думать.

    2dark-demon

    С# компилируется...

    Более того даже в скриптовых языках префиксная форма ++ имеет больший приоритет, чем суффиксная или постфиксная, если угодно.
     
  10. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Все точно.

    Смотрите.
    Какая-то фигня.
    Мы когда последним действием складываем переменные, то в обеих в них уже все равно 7.
    А не 6 и 7.

    Тогда че за фигня в PHP, C# и JS?
     
  11. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Самое интересное, что
    PHP:
    1. <?php
    2. $i = 5;
    3. echo (++$i)+(++$i);
    4. ?>
    тоже выдает 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.

    Т.е. разница в понятии "переменная".
     
  12. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    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
     
  13. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Дизасемблер в помощь.
    Если у себя откопаю, завтра утром расскажу :)
     
  14. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Вобще-то складываться должны не переменна $i (которая в конце 7) сама с собой, а результаты двух выражений.
    Скорее всего, она будет в стеке или регистре.
     
  15. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    а как вам это? =)
    Код (Text):
    1. $ cat a.pl
    2. #!/usr/bin/perl
    3.  
    4. $i = 5;
    5. $i = ++$i + ++$i;
    6. print $i;
    7.  
    8. $ ./a.pl
    9. 14
     
  16. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    AlexGousev, разве я не то же самое сказал? :)

    Петр, ну да, и пхп с явой компилируемые, однако это не отменяет их скриптовую природу :)

    vasa_c, дебагер показывает, что следующие два куска кода идентичны:
    Код (Text):
    1. int o = 5; o = ++o + ++o;
    Код (Text):
    1. int u = 5; ++u; ++u; u = u+u;
    как я, собствено, и говорил.
     
  17. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    simpson, а-а-а! ты разрушил такую красивую теорию :)
     
  18. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кстати компилятор Си вот что говорит
    Код (Text):
    1.    ;                          
    2.    ;            int i = 5;    
    3.    ;                          
    4.         mov     si,5          
    5.    ;                          
    6.    ;            i = ++i + ++i;
    7.    ;                          
    8.         inc     si            
    9.         inc     si            
    10.         mov     ax,si        
    11.         add     ax,si        
    12.         mov     si,ax        
    (c) 1990 Borland Turbo C++ Version 1.01 :D

    В свою очередь следующая конструкция
    Код (Text):
    1. double a = 0, b = 1;
    2. while (b < 2147483647)
    3.     a = a + (1 / (b += 2)) - (1 / (b += 2));
    работает одинаково и на Си и на JavaScript
    (только условие в while желательно поменьше поставить, а то "задолбаетесь" джать)

    PS где модераторы, надо выделить это обсуждение в отдельный топик[/code]
     
  19. Amian

    Amian Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    приорететы операций разные
     
  20. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    думали уже об этом.
    приоритеты правильные.
     
  21. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    я то тут, только у меня прав нету.
     
  22. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    о! маза!
    подарите мне плюсомет с радиусом действия на все форумы =)
    ну пожалста =)
     
  23. Amian

    Amian Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Петр
    А это как понять по-твоему? :p
    Код (Text):
    1.  
    2.         inc     si            
    3.         inc     si            
    4.         mov     ax,si          
    5.         add     ax,si          
    6.         mov     si,ax  
    Сначала выполняется инструкция инцрементации v C++,поэтому и получается 14.Видимо Php и т.д. трактуют ++i не как отдельную инструкцию,а как операцию i=i+1,отсюда и результат.
    Хотя странно,написано 1,а происходит совсем другое:
    http://www.php.net/manual/ru/language.operators.php
    В PHP тоже должно быть 14 >.< Bug ?
     
  24. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Петр
    Мы складываем не переменные, а выражения.
    Результатом первого выражения никак не может быть 7 хотя бы потому, что изначально i было равно 5 :)
    В данном случае глючат языки, возвращающие 14, а происходит это потому, что они используют один и тот же регистр для хранения переменной из разных контекстов.
    Попробуйте в настройках компилятора отключить низкоуровневую оптимизацию и посмотреть, какие будут результаты.

    P.S. А еще попробуйте выражение ++i + ++i + ++i + ... (и так далее, допустим всего штук 10)
    что-то мне подсказывает, что начиная с определенного момента у оптимизатора не хватит мозгов все это оптимизировать и результат начнет совпадать со здравым смыслом ;)
     
  25. Amian

    Amian Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Dagdamor
    Посмотри еще раз как эта операция выглядит на ассемблере после трансляции C++:
    Код (Text):
    1.  
    2.         inc     si            //инкрементация
    3.         inc     si            //инкрементация
    4.         mov     ax,si         //записываем данные в акамулятор(регистр)
    5.         add     ax,si         //сложение
    6.         mov     si,ax        //записываем результат из акамулятора в то же самый адрес откуда все время и брали эту переменную,он не изменился.
    Тут какраз всё правильно т.к. согласно таблице приорететов должна сначала выполняться инструкция инкрементации,поэтому и результат будет 14.
    Может! Переменная хранится всё время в 1 месте.Распишу как это происходит:
    1- согласно таблице приоритетов сначала выполняется первая инкрементация,результат записывается на место старого. //5+1=6
    2 - выполняется вторая инкрементация,результат записывается на место старого.6+1=7
    3 - производится сложение 1-ой и той же переменной с 1м и тем же адресом самой с собой и записывается опять таки в то же самое старое место! //7+7=14
    Бррр ... сразу видно что на C/C++ или ассемблере ты не програмировал :) Что значит "разные контексты" ? Програма выделяет память под переменную с определённым адресом и он не меняется.И операции с регистрами тут уж точно никаким боком не стоят т.к. перед выполнением регистровых операций данные загружаются в регистр из памяти ,регистры не используются для хранения данных :p