+ Ответить в теме
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: i-=(++++i)+++1;

  1. #1
    Мафия местный ant_katcin Путь к славе только начался Аватар для ant_katcin
    Регистрация
    01.03.2007
    Сообщений
    484
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию i-=(++++i)+++1;

    Встречился с одной интересной задачей не так давно.
    Вот:

    int i = 5;
    i-=(++++i)+++1;
    cout << i;

    Что выведится? И, главное, почему.

    не посмотрев результата, я так и не смог ответить правильно.. да и потом с трудом разобрался..

  2. #2
    туземец ph0enix Жизненный путь еще не решен Аватар для ph0enix
    Регистрация
    19.09.2006
    Сообщений
    2
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    подобные трюки традиционно не описываются стандартом и зависят от компилятора. gcc 3.4.6 вообще этот код не компилирует:

    test.c:3: error: invalid lvalue in increment

    что кажется правильным: результат преинкремента не является lvalue

  3. #3
    здешний un_drew Путь к славе только начался Аватар для un_drew
    Регистрация
    19.01.2007
    Сообщений
    189
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    test.c:3: error: invalid lvalue in increment
    : и правильно говорит, ++ это же оператор, значит до или после него должен следовать операнд...

  4. #4
    туземец ph0enix Жизненный путь еще не решен Аватар для ph0enix
    Регистрация
    19.09.2006
    Сообщений
    2
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    А если вот так
    Код:
    #include <cstdio>
    class A {
        int a;
        public:
            A(int b): a(b) { }
            int getA() const { return a; }
            A& operator-=(const A& rho) {
                a -= rho.a;
                return *this;
            }
            A& operator++() {
                ++a;
                return *this;
            }
            A operator++(int) {
                A foo(this->a+1);
                ++a;
                return foo;
            }
            A operator+(int i) const {
                return A(i+a);
            }
    };
    int main() {
        A a(5);
        a -= (++++a)+++1;
        printf("%d\n", a.getA());
    }

  5. #5
    Мафия местный ant_katcin Путь к славе только начался Аватар для ant_katcin
    Регистрация
    01.03.2007
    Сообщений
    484
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    выдержка из стандарта
    5.3.2 - Increment and decrement [expr.pre.incr]

    -1- The operand of prefix ++ is modified by adding 1, or set to true if it is bool (this use is deprecated). The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a completely-defined object type. The value is the new value of the operand; it is an lvalue. If x is not of type bool, the expression ++x is equivalent to x+=1. [Note: see the discussions of addition and assignment operators for information on conversions. ]
    там конечно дальше сказано, что если пользователь переопределяет, то будет так как он захочет, но по умолчанию-то lvalue.

    значит должен код компилироваться..

  6. #6
    House style краевед Raz0r Его знают всеRaz0r Его знают всеRaz0r Его знают всеRaz0r Его знают всеRaz0r Его знают всеRaz0r Его знают все Аватар для Raz0r
    Регистрация
    25.12.2006
    Адрес
    Новосибирск, Ленинский район
    Сообщений
    3,669
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    ant_katcin, в след раз создавайте пож тему с норм названием, а не одними символами
    Глупец думает, что он действительно умен, а мудрец знает, что он глуп.
    ШЕКСПИР Уильям


  7. #7
    Мафия местный ant_katcin Путь к славе только начался Аватар для ant_katcin
    Регистрация
    01.03.2007
    Сообщений
    484
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    Цитата Сообщение от Max16 Посмотреть сообщение
    ant_katcin, в след раз создавайте пож тему с норм названием, а не одними символами
    А что? i-=(++++i)+++1; хорошо отражает суть того что тут обсуждается

  8. #8
    туземец perf Жизненный путь еще не решен Аватар для perf
    Регистрация
    31.12.2006
    Сообщений
    27
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    Цитата Сообщение от ant_katcin Посмотреть сообщение
    не посмотрев результата, я так и не смог ответить правильно..
    правильный ответ - результат не определен
    ключевая фраза для поиска - sequence point

  9. #9
    Мафия местный ant_katcin Путь к славе только начался Аватар для ant_katcin
    Регистрация
    01.03.2007
    Сообщений
    484
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    Цитата Сообщение от perf Посмотреть сообщение
    правильный ответ - результат не определен
    ключевая фраза для поиска - sequence point
    простите, но где здесь неопределенность последовательности вычисления?

  10. #10
    кореной житель IVM мелкий пакостник Аватар для IVM
    Регистрация
    27.06.2007
    Сообщений
    1,534
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию Re: i-=(++++i)+++1;

    Цитата Сообщение от ant_katcin Посмотреть сообщение
    простите, но где здесь неопределенность последовательности вычисления?
    Не здесь, а вообще. Любой человек, программирующий на C/С++ должен отдавать себе отчёт, что в этих языках порядок вычисления выражений не детерминирован. Поэтому совершенно верно тут уже сказали, что будет на этапе выполнения — целиком и полностью зависит от конкретного компилятора.

+ Ответить в теме
Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения