Управляемые выражения в C++

Этот раздел применим к:

Выпуск

Visual Basic

C#

F#

C++

Web Developer

Express

Тема не применяется Тема не применяется Тема не применяется Тема применяется Тема не применяется

Pro, Premium и Ultimate

Тема не применяется Тема не применяется Тема не применяется Тема применяется Тема не применяется

Вычислитель выражений управляемого кода может обрабатывать большинство выражений на Visual C++. В следующих разделах содержатся сведения о типах выражений и рассматриваются некоторые типы, не поддерживаемые вычислителем:

  • Идентификаторы и типы

  • Вычисление функций

  • Операторы

  • Перегруженные операторы

  • Строки

  • Приведение типов

  • Сравнение и назначение объектов

  • Операторы "typeof" и "sizeof"

  • Упаковка–преобразование

  • Вычисление свойств

Вычислитель выражений игнорирует квалификаторы доступа: public, protected, internal и private. Например, можно вызвать метод private из окна Контрольные значения.

Вычислитель выражений выполняет все вычисления в небезопасном неявном контексте, независимо от того, является ли выполняемый код безопасным или нет.

Для отображения содержимого типа данных в удобочитаемом виде отладчик использует правила автоподстановки. При необходимости можно добавить пользовательские элементы автоподстановки для отображения пользовательских типов данных. Дополнительные сведения см. в разделе Отображение элементов пользовательского типа данных.

Идентификаторы и типы

В выражениях отладчика можно использовать любые идентификаторы, отображающиеся в текущей области. Например, если отладчик остановлен во время выполнения функции magh, то можно использовать любые идентификаторы, отображающиеся в области magh, включая константы, имена переменных и имена функций.

Отладчик правильно отображает любые переменные типов primitive, enum, intrinsic. Для переменных типа class отладчик правильно отображает значение на основе ближайшего производного типа. Если имеется объект leo типа lion, производный от типа cat, то можно вычислить leo.clawlength и получить правильное значение для объекта типа lion.

Можно назначить новое значение любому выражению левой части, которое является L-значением примитивного типа. Присваивание новых значений типам класса и массива не поддерживается.

Вычисление функций

Отладчик поддерживает вычисление функций, в том числе перегруженных. Поэтому при вводе любого из следующих выражений отладчик вызовет нужную версию перегруженной функции:

kanga ()
kanga (roo)

При вычислении функции в отладчике фактически вызывается и выполняется код этой функции. Если при выполнении функции возникают побочные эффекты, такие как выделение памяти или изменение значения глобальной переменной, то вычисление функции в окне отладчика приведет к изменению состояния программы, что может повлечь за собой непредвиденные результаты.

Если задать точку останова в перегруженной функции, расположение точки останова будет зависеть от способа задания функции. Если задать только имя функции, то отладчик установит по одной точке останова в каждой версии перегруженной функции с этим именем. Если задать полную подпись, имя функции и полный список аргументов, отладчик установит одну точку останова в указанной версии перегруженной функции.

Операторы

Отладчик правильно вычисляет большинство встроенных операторов, в том числе перечисленные ниже.

  • Реляционные операторы: (expr1 >expr2, expr1 < expr2, expr1 <= expr2, expr1 => expr2, expr1 == expr2, expr1 != expr2).

  • Логические операторы: (expr1 && expr2, expr1 || expr2).

  • Оператор условия: (expr1 ? expr2 : expr3).

  • Арифметические операторы: (выражение1 + выражение2, выражение1 - выражение2,выражение1 * выражение2, выражение1 / выражение2, выражение1 % выражение2).

  • Битовые операторы: (выражение1 & выражение2, выражение1 ^ выражение2, выражение1 | выражение2, выражение1 ~ выражение2).

  • Операторы сдвига. Например: (expr1 >> expr2, expr1 << expr2, expr1 >>> expr2).

  • Операторы присваивания: ( lvalue = expr2, lvalue *= expr2, lvalue /= expr2, lvalue %= expr2, lvalue += expr2, lvalue -= expr2, lvalue <<= expr2, lvalue >>=expr2, lvalue &= expr2, lvalue ^= expr2, lvalue |= expr2).

  • Унарные операторы. Например: ( + expr1, - expr1, expr1++, ++ expr1, expr1--, -- expr1 ).

Для ввода последовательности выражений можно воспользоваться оператором-запятой: expr1, expr2,expr3.

Перегруженные операторы

В отладчике можно использовать большинство перегруженных операторов.

В частности, допустимы перегруженные инфиксные операторы +, -, /, % и &.

  • expr1 + expr2

  • expr1 expr2

  • expr1 / expr2

  • expr1 % expr2

  • expr1 & expr2

Перегруженные инфиксные операторы =, &&, &, ||, | и ^ в отладчике не действуют.

  • expr1 = expr2

  • expr1 && expr2

  • expr1 & expr2

  • expr1 || expr2

  • expr1 | expr2

  • expr1 ^ expr2

Перегруженные реляционные операторы ==,!=, >, <, >=, и <= не будут работать в C++:

  • expr1 == expr2

  • expr1 != expr2

  • expr1 > expr2

  • expr1 < expr2

  • expr1 >= expr2

  • expr1 <= expr2

Перегруженные инфиксные операторы |, ^, <<, >>, >, <, >= и <= в отладчике не действуют.

  • expr1 | expr2

  • expr1 ^ expr2

  • expr1 << expr2

  • expr1 >> expr2

  • expr1 > expr2

  • expr1 < expr2

  • expr1 >= expr2

  • expr1 <= expr2

Перегруженные префиксные операторы +, -, ++, --, ! и ~ поддерживаются.

  • + expr1

  • - expr1

  • ++ expr1

  • -- expr1

  • ! expr1

  • ~ expr1

Перегруженные постфиксные операторы ++ и – поддерживаются.

  • expr1++

  • expr1--

Перегруженный оператор [] поддерживается.

  • x[expr2]

Многомерные массивы

В C++ вычислитель выражений использует стиль синтаксиса C# для многомерных массивов. Примеры.

c[0,0]

Использование обычного синтаксиса C++ вызывает ошибку:

ошибка c[0][0]:индекс '0' находится вне границ для указателя/массива 'c'

Строки

Отладчик распознает оператор индексирования, если он применяется к строкам или массивам. Например, в отладчике можно ввести следующее:

"hello world"[0]

В окне Контрольное значение появится правильное значение:

'h'

Приведение типов

В отладчике поддерживаются простые выражения приведения типов:

(A)x

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

Пользовательские приведения типов не работают в отладчике в Visual C++.

Сравнение и назначение объектов

Сравнение и назначение объектов в отладчике не работает в Visual C++.

Операторы "typeof" и "sizeof"

Отладчик поддерживает оператор "typeof", преобразуя его в эквивалентную функцию платформы .NET Framework.

typeof ( выражение )

преобразуется в:

System.Type.GetType(expression )

Затем отладчик вычисляет уже преобразованное выражение.

Отладчик не поддерживает оператор sizeof.

Упаковка-преобразование и распаковка-преобразование

Вычислитель выражений отладчика не поддерживает упаковку–преобразование и распаковку–преобразование в Visual C++. Дополнительные сведения см. в разделе Упаковка–преобразование и распаковка–преобразование. Если имеется целочисленная переменная i, которая с помощью упаковки была преобразована в объект, то отладчик будет вычислять i как целое число, а не как объект. Это может привести к непредвиденным результатам.

Вычисление свойств

Отладчик может вычислять свойства в любом окне переменной. Однако вычисление свойств в отладчике может иметь побочные эффекты, которые приведут к непредвиденным и нежелательным результатам. Чтобы избежать побочных эффектов, вызванных случайными вычислениями, можно отключить поддержку вычисления свойств в диалоговом окне Параметры.

WebMethods

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

См. также

Другие ресурсы

Выражения в отладчике