И снова ++x + ++x !!!

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

  1. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    maxdiver
    раз мы обсуждаем Стандарт, то про про "надо" ничего не сказано. (или я ошибаюсь?)
    похоже никто не знает, кроме разрабов того или иного компилера :)
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    maxdiver

    > если имеется незнание основ языка, например, действия операторов или порядка вычислений аргументов функций?

    Какой ужас!!! Оказывается я не знаю основ языка!!! Сам maxdiver мне это сказал! Этого позора я не переживу... :'-(
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    RedLord
    ;) А человек не знал именно этого - что никто не знает порядка вычисления ;)

    Естественно, что в Стандарте безопасность исключений не обсуждается. Однако это "надо" явно следует из того, что 1) порядок вычисления параметров неизвестен; 2) механизм действия при возникновении исключения таков, что вызываются деструкторы только для уже сконструированных объектов.

    _DEN_
    ))))))))))
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _DEN_

    > При чем тут порядок вычисления аргументов? Во-первых, я знаю что он не определен...

    Видимо не один я читаю посты по диагонали.
     
  5. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    maxdiver

    обсуждается :)
    http://std.dkuug.dk/jtc1/sc22/wg21/docs/cwg_closed.html#130

    только решается оно путем совета "как надо" :)
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    maxdiver
    Не стоит так категорично. :derisive:
    Когда изучаешь язык методом живого программирования, часто случаются пробелы в "базовых" знаниях. Гораздо проще, имея практический опыт, шлифануться Стандартом, чем наоборот.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Как ты смеешь так разговаривать с maxdiver?! Это же князь всея Сиплюсплюсии!


    maxdiver

    :) Исключения сами по себе безопасны и их безопасность обсуждать не нужно))
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Как ты смеешь так разговаривать с maxdiver?! Это же князь всея Сиплюсплюсии!


    maxdiver

    :) Исключения сами по себе безопасны и их безопасность обсуждать не нужно))
     
  9. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    я тут провел один эксперимент.
    получается, что Intel, Comeau реализуют new+конструирование с учетом предложения Саттера. (а возможно исходя из других соображений)
    а вот VC8.0, к которому Саттер имеет непосредственное отношение - нет.

    и естественно все, исходя из Стандарта, правы :)
     
  10. matich

    matich New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    72
    А я вот вообще не пойму зачем так(x = ++x + ++x) извращаться =)
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    matich

    Извращаться так действительно не зачем. Разбор таких ситуаций просто помогает понять логику поведения, предписанную стандартом.
     
  12. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    В джаве, пхп, дотнете - 13.
    А вот в перле по-разному ) Как и в сишнике.

    Я за 13.
     
  13. george_dimov

    george_dimov New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2007
    Сообщения:
    2
    Я только вчера подключился. У Dev-C++ 4.9.9.2 тоже получается 3, однако только после замены словечка plus чемто другим (я использовал add) иначе прогу не уважает.
     
  14. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    кстати говоря, конструкция типа foo(i++, j++) так же относится к числу весьма небезопасных, поскольку foo может быть и макросом типа:
    #define foo(a, b) ((a) < (b) ? (b) : (a))
    "развертывание" которого ведет к ub
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    kaspersky

    Макросы в руках бабуина вообще штука стремная. И дело тут даже не в ++. Поставь в качестве аргументов вызов функции.
     
  16. Ss_oO0

    Ss_oO0 New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2006
    Сообщения:
    65
    Код (Text):
    1. int plus(int a, int b, int c, int d)
    2. {
    3.     return a + b + c + d;
    4. }
    5.  
    6. int main()
    7. {
    8.     int x = 0;
    9.  
    10.     x = ++x + ++x + ++x + ++x;
    11.     printf("%d\n",x);
    12.  
    13.     x=0;
    14.     x = plus(++x,++x,++x,++x);
    15.     printf("%d\n",x);
    16.  
    17.     return 0;
    18. }
    >./a.out
    11
    16

    gcc version 4.1.1
     
  17. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    а 11 то как получилось?
     
  18. Ss_oO0

    Ss_oO0 New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2006
    Сообщения:
    65
    gcc -S test.c выдает:

    x = ++x + ++x + ++x + ++x;
    Код (Text):
    1.         movl    $0, -8(%ebp)
    2.         incl    -8(%ebp)
    3.         incl    -8(%ebp)
    4.         movl    -8(%ebp), %eax
    5.         addl    -8(%ebp), %eax
    6.         incl    -8(%ebp)
    7.         addl    -8(%ebp), %eax
    8.         incl    -8(%ebp)
    9.         addl    %eax, -8(%ebp)
    10.         movl    -8(%ebp), %eax
    что в переводе на русский означает
    Код (Text):
    1. x++         //x==1
    2. x++         //x==2
    3. eax = x     //eax==2
    4. eax += x    //eax==4
    5. x++         //x==3
    6. eax += x    //eax==7
    7. x++         //x==4
    8. x += eax    //x==11
    9. eax = x     //eax==11