int i=0; i = i++ + ++i - i++; чему равно i?

Тема в разделе "LANGS.C", создана пользователем na1s, 24 окт 2007.

  1. na1s

    na1s New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    21
    Почему i==3?
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
  3. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ИМХО приоритетность операций
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    на этом форуме в какой-то теме помнится довольно внятно все было расписано касаемо сабжа. поищите, там больше разъяснений. ну или в вики по пред. посту гляньте.
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    БОЯН, UB
    PS А в продакшен коде за такое можно и на костер попасть ;)
     
  6. hwegh

    hwegh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    54
    баян
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В здравом уме конечно такое применять не советую.
    Что до ответа, то компиллер вообще может заменит эту лабуду на более простое, типо i + 3, Парсит компилятор, а ему по фигу он просто разбирает выражение и меняет его на более пристойное, а по семантике 3 и выходит, то есть:
    1) 0+1-0
    2)++
    3)++

    А вообще вот цитата из одной книженции:
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    чушь. разве что компиляторы не языка Си.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    t00x
    Ну если на это есть стандарт, то снимаю шляпу, но imho это опять UB.
    Хотя возможно книга древняя, до принятия стандарта.
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Booster
    данное выражение интерпретируется всеми компиляторами языка Си одинаково даже без скобок и без стандартов, по правилам приоритетности операций для Си.
    и тем более со скобками.
     
  11. Icegenerator

    Icegenerator New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    5
    гыгы. undefined behaviour.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    t00x
    А побочных эффектов не существует?
    Вот из ещё одного учебника.
    И у Фуера тоже всколзь об этом есть.
    Лично мне такие выражения не кажутся однозначными. Как ты интерпретируешь сабжевое выражение, и считаешь ли ты эту интерпретацию единственно верной?
     
  13. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Booster
    это не препараты, это МАТЕМАТИКА.
    google в помощь.
     
  14. Icegenerator

    Icegenerator New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    5
    Читайте стандарт, господа.
     
  15. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Booster
    Как сказал Icegenerator, это UB, вот что генерит мс-компилер
    с настройками по умолчанию:

    Код (Text):
    1. main()
    2. {
    3.     int i = 2;
    4.     int j = 6;
    5.    
    6.     printf("%d\n", i*j + j++ + --i);
    7. }
    8.  
    9. asm:
    10.     mov DWORD PTR _i$[ebp], 2   ; i = 2
    11.     mov DWORD PTR _j$[ebp], 6   ; j = 6
    12.  
    13.  
    14.     mov eax, DWORD PTR _i$[ebp]
    15.     sub eax, 1                  
    16.     mov DWORD PTR _i$[ebp], eax
    17.     mov ecx, DWORD PTR _i$[ebp]
    18.     imul    ecx, DWORD PTR _j$[ebp]
    19.     add ecx, DWORD PTR _j$[ebp]
    20.     add ecx, DWORD PTR _i$[ebp]
    [+]
    Интересная ссылка: http://alenacpp.blogspot.com/2005/08/unspecified-behavior-undefined.html
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    t00x
    Ладно, давай детально.
    Начнём с того что это не математика, а алгоритм вычисления выражения ввиде грамматики. Причём алгоритм сложный (точно не элементарный). Разбирает грамматику компилятор, а как он её интерпретирует мы точно не знаем. Сначала выполняется префиксная операция ++i, только после этого оно участвует в вычислении. Но откуда уверенность что ++i - i++ даст единицу, а не ноль, ведь i уже равно 1. Насколько мне известно определённое поведение не специфицировано. Об этом трубиться во многих учебниках, цитаты из которых я привёл.
     
  17. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    na1s
    http://www.wasm.ru/forum/viewtopic.php?id=20504
     
  18. Elusory Jo

    Elusory Jo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2006
    Сообщения:
    30
    Адрес:
    Moscow
    Хмм.. А что такое UB ?....
     
  19. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Elusory Jo
    См. ссылку из 15
     
  20. CoolCmd

    CoolCmd New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    21
    Адрес:
    Moscow
    Интересно, а эти конструкции дадут unspecified behavior ?
    (x = 1) + x
    (x = 1) - 2