C++ + C++

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

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вот оно, собственно:
    Код (Text):
    1. int c= 1;
    2. c= c++ + c++;
    и
    Код (Text):
    1. int c= 1;
    2. c= ++c + ++c;
    наю, забитая уже тема, но все же...

    принято считать, что стандарт не определяет результата ни одного из этих выражений, только вот я не понимаю, каким образом результирующее значение c во втором сэмплике может отличаться от 6
     
  2. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Есть постфикс(с++) и префикс(++с). Так вот в первом случае по стандарту будет выполнено выражение/сравнение(или любая другая операция языка, если она имеется) и только потом инкрементирование, а во втором случае сначала инкремент, а потом другие операции.
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Nouzui, читай лекции за первый курс по с++!
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    да лан, у меня их и не было )) я лучше 14882-98 посмотрю (http://www.kuzbass.ru:8086/docs/isocpp/expr.html):

     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    про i = v[i++]; это действительно первый курс, значит, и i= i++ + i++ тоже не определен (кстати, а просто i++ + i++ определено? я в той каше по ссылке быстро потерялся))

    зато i= ++i + ++i; на мой взгляд, не может быть вычислен разными способами, потому что преинкременты в любом случае выполнятся до, и вернут именующее значение. Таким образом, что значит:
    я тоже не понимаю
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    дык очевидно, что это увеличение на два
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это с какого перепугу unspecified?
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    IceStudent
    если смотреть по ссылке:
    это условие здесь не выполняется

    а про постинкремент было сказано вот что:
    непонятно, что здесь понимается под "After the result is noted". Возможны два варианта развития событий:
    int temp= i;
    i++;
    i= v[temp];

    и
    int temp= i;
    i= v[temp];
    i++;

    насколько я понимаю, стандарт не определяет, по какому из сценарев должно вычисляться выражение
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    Да, ты прав. Посмотрел в стандарте 2003 - то же самое.
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    IceStudent
    да это-то ладно
    а вот с какого:
    ?
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Я в таких тонкостях стандарта не разбираюсь, это лучше на рсдн ответа поискать.
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Nouzui
    http://msdn2.microsoft.com/en-us/library/126fe14k.aspx
    Должно бы по идее быть ((++i) + 1)
     
  13. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Nouzui
    думаю вам стоит почитать о sequence points
     
  14. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    censored
    а можно в двух словах? а то этот стандарт читать oO
    sequence points - это что то вроде вызовов функций, возврата итд?
     
  15. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Nouzui
    Грубо говоря, seq. points (точки следования) это "запятые", по к-рым компилятор определяет порядок исполнения. Примерами SP являются операторы &&, ||, ?, comma, ;, etc.
    За глубокими знаниями -- в стандарт ;).
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Насколько я понял, sequence points - это точки, в которых должны быть завершены все "side effects", в частности, sequence point являются вызовы функций, return, &&, ||, ?, comma, ; Кстати - ";"!
    значит, в i= 1 + i++; этот самый ++ может сработать в любом месте до начала следующего выражения. Это понятно. А как насчет
    i = ++i + 1;
    разве преинкремент не должен однозначно выполниться первым, ведь он возвращает ссылку на переменную, а не значение?
     
  17. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Nouzui
    А он не должен выполнятся первым - стандарт не гарантирует, что компилятор в целях оптимизации не поменяет их местами, и выполнит скажем так:
    i = 1;
    i += ++i;
     
  18. BreakPointMAN

    BreakPointMAN New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    42
    Адрес:
    Russia
    На русском языке по точкам следования вот здесь неплохо разжевано. :)
     
  19. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    здрасьте, приехали
    теперь еще и a=b=c стало undefined
     
  20. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Народ, смотрите, говорится же, что оператор || является sequence point, но если выполнить такое выражение
    Код (Text):
    1. int i=0; int j=0;
    2. int k;
    3. k = (i++) || (j++);
    , то получается, что k == 0. А ведь вроде все side effect'ы должны быть закончены...