На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> Как настроить отладку в VS для наблюдения за операциями декремента и инкремента?
    ExpandedWrap disabled
      #include <stdio.h>
      void main()
      {
          int x = 1;
          x = x + x++;
          printf("%d", x);
          scanf_s("%d", &x);
      }


    Когда наблюдаю в отладчике за переменной x, то на строке x = x + x++; x сразу становится равным 3. Что сделать, чтобы увидеть конкретную последовательность действий где стало 2, а где 3, если это возможно.
    Сообщение отредактировано: southern -
      Цитата southern @
      Что сделать, чтобы увидеть конкретную последовательность действий где стало 2, а где 3, если это возможно.
      Поставить точку отладки на интересующую вас строку, а потом нажать Alt+8 или в глобальном меню выбрать Отладка\Окна\Дизассемблированный код. (если у вас русифицирована :blush: )
        Цитата southern @
        Когда наблюдаю в отладчике за переменной x, то на строке x = x + x++; x сразу становится равным 3.
        Потому что отладчик сперва полностью выполняет оператор, и только потом делает останов, показывая содержимое переменных.
        Цитата southern @
        Что сделать, чтобы увидеть конкретную последовательность действий где стало 2, а где 3, если это возможно.
        В отладчике нет просмотра кода? Там можно посмотреть сгенерированную последовательность команд.

        В современных компиляторах такая операция обычно даёт результаты, аналогичные последовательности
        ExpandedWrap disabled
          x = x + x;
          x++;
        то есть сперва выполняются все преинкременты/декременты, потом вычисления производятся так, будто никаких инкрементов/декрементов нет, и под конец производятся все постинкременты/декременты.
        подозреваю, что
        ExpandedWrap disabled
          x = ++x + x++;
        даст в результате 5.

        При вычислении выражения производится только инкремент/декремент указателей, когда он поддерживается аппаратно.
          Цитата southern @
          x = x + x++;

          Это неопределённое поведение.
            Надо знать какой приоритет операций у компилятора. Например C# и С++ дают разный результаты.
              Цитата Bas @
              Надо знать какой приоритет операций у компилятора. Например C# и С++ дают разный результаты.
              Это зависит не от приоритета операций. К тому же в C++ и C# конкретно эти операции имеют сходные приоритеты.
                southern, цель какая?

                Добавлено
                Цитата Bas @
                Надо знать какой приоритет операций у компилятора

                Выше постом OpenGL ответил абсолютно исчерпывающе.
                  Цитата shm @
                  Выше постом OpenGL ответил абсолютно исчерпывающе.

                  А теперь освежим прочитаное - тесты от исходников.ру
                  Мини-тест, Освежи свои знания.
                  Мини-тест-B
                  Мини-тест С, Дабы окончательно разобраться
                  Конфуз
                  Сообщение отредактировано: Bas -
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0.0714 ]   [ 15 queries used ]   [ Generated: 27.07.26, 13:04 GMT ]