C++ 中的托管表达式

该托管表达式计算器接受大多数用 Visual C++ 编写的表达式。 以下主题提供特定信息并讨论某些不支持的表达式类型:

  • 标识符和类型

  • 函数计算

  • 运算符

  • 重载运算符

  • 字符串

  • 强制转换

  • 对象比较和赋值

  • typeof 和 sizeof 运算符

  • 装箱

  • 属性计算

表达式计算器忽略访问限定符 public、protected、internal 和 private。 例如,您可以从**“监视”**窗口调用 private 方法。

表达式计算器在隐式的不安全的上下文中执行所有计算,无论所执行的代码是否安全。

调试器使用自动展开规则以有意义的形式显示数据类型的内容。 如果需要,可添加自定义自动展开元素来显示自己的自定义数据类型。 有关更多信息,请参见显示自定义数据类型的元素

标识符和类型

调试器表达式可以使用在当前范围内可见的任何标识符。 例如,如果调试器在函数 magh 中暂停,则可以使用在 magh 中可见的任何标识符(包括常数、变量名和函数名)。

调试器可以正确地显示任何 primitive、enum 或 intrinsic 类型的变量。 对于 class 类型的变量,调试器基于派生程度最大的类型正确显示值。 如果具有从类型 cat 派生的 lion 类型的对象 leo,则可为类型 lion 的对象计算 leo.clawlength 并获得正确的值。

可以将新值赋给任何为基元类型左值的左表达式。 不支持向类和数组类型赋值。

函数计算

调试器支持函数的计算,包括重载函数的计算。 因此,您可以输入以下表达式之一,并且调试器将调用重载函数的正确版本:

kanga ()
kanga (roo)

在调试器中计算函数实际上是调用并执行该函数的代码。 如果函数具有副作用,例如分配内存或更改全局变量的值,则在调试器窗口中计算该函数将更改程序的状态,这可能生成意外的结果。

在对重载函数设置断点时,断点的位置取决于指定函数的方式。 如果只指定函数名,则调试器将对该函数名的每一重载设置一个断点。 如果指定完整签名(函数名和完整参数列表),调试器将对指定重载设置一个断点。

运算符

调试器正确地计算大多数内置运算符,包括:

  • 关系运算符:(表达式1 >表达式2、表达式1 < 表达式2、表达式1 <= 表达式2、表达式1 => 表达式2、表达式1 == 表达式2、表达式1 != 表达式2)。

  • 布尔运算符:(表达式1 && 表达式2、表达式1 || 表达式2)。

  • 条件运算符:(expr1 ? 表达式2 : 表达式3。

  • 算术运算符:(表达式1 + 表达式2、表达式1 -expr2、expr1 * expr2, expr1 / expr2, expr1 % expr2)。

  • 位运算符:(expr1 & expr2、expr1 ^ expr2、expr1 |expr2, expr1 ~ expr2)。

  • 移位运算符。 示例:(expr1 >>expr2, expr1 <<expr2, expr1 >>> expr2)。

  • 赋值运算符:(左值 = expr2, lvalue *= expr2, lvalue/= expr2, lvalue %= expr2, lvalue += expr2,左值 - = expr2,左值 <<= expr2,左值 >>=expr2,左值 &= expr2, lvalue ^= expr2,左值|= expr2)。

  • 一元运算符。 示例:(+expr1), expr1, expr1++, C++expr1, expr1--,--expr1 )。

可以使用逗号运算符输入一系列表达式: expr1, expr2,expr3。

重载运算符

大多数重载运算符在调试器中有效。

重载中缀运算符 +、-、/、% 和 & 有效:

  • 表达式1 + 表达式2

  • 表达式1 表达式2

  • 表达式1 / 表达式2

  • 表达式1 % 表达式2

  • 表达式1 & 表达式2

重载中缀运算符 =、&&、&、||、| 和 ^ 无效:

  • 表达式1 = 表达式2

  • 表达式1 && 表达式2

  • 表达式1 & 表达式2

  • 表达式1 || 表达式2

  • 表达式1 | 表达式2

  • 表达式1 ^ 表达式2

对于 C++,重载关系运算符 ==、!=、>、<、>= 和 <= 无效:

  • 表达式1 == 表达式2

  • 表达式1 != 表达式2

  • 表达式1 > 表达式2

  • 表达式1 < 表达式2

  • 表达式1 >= 表达式2

  • 表达式1 <= 表达式2

重载中缀运算符 |、^、<<、>>、>、<、>= 和 <= 无效:

  • 表达式1 | 表达式2

  • 表达式1 ^ 表达式2

  • 表达式1 << 表达式2

  • 表达式1 >> 表达式2

  • 表达式1 > 表达式2

  • 表达式1 < 表达式2

  • 表达式1 >= 表达式2

  • 表达式1 <= 表达式2

重载前缀运算符 +、-、++、--、! 和 ~ 有效:

  • +expr1

  • -expr1

  • C++expr1

  • --expr1

  • !表达式1

  • ~expr1

重载后缀运算符 ++ 和 -- 有效:

  • 表达式1++

  • 表达式1--

重载运算符 [] 有效:

  • x[表达式2]

多维数组

对于多维数组,C++ 表达式计算器使用 C# 样式的语法。 例如:

c[0,0]

使用正常的 C++ 语法将生成错误:

c[0][0] 错误:索引 0 " 的指针上/数组 " c " 的边框外

字符串

调试器不仅可识别与数组一起使用的索引运算符,还可识别与字符串一起使用的索引运算符。 例如,您可以输入:

"hello world"[0]

**“监视”**窗口将显示正确的值:

'h'

强制转换

简单强制转换表达式在调试器中有效:

(A)x

涉及指针的强制转换在调试器中将无效:

在 Visual C++ 的调试器中,用户定义的强制转换不起作用。

对象比较和赋值

对于 Visual C++,调试器中的对象比较和分配不起作用。

typeof 和 sizeof 运算符

调试器支持 typeof 和 sizeof 运算符,方法是将其转换为等效的 .NET Framework 函数。

typeof ( 表达式 )

被转换为:

System.Type.GetType(expression )

调试器随后计算该已转换表达式。

调试器不支持 sizeof 运算符。

装箱和取消装箱

调试器表达式运算符不支持 Visual C++ 中的装箱和取消装箱。 有关更多信息,请参见装箱和取消装箱。 如果具有一个已通过装箱转换为对象的整型变量 i,则调试器将把 i 作为整数而非对象进行计算。 结果可能不是您所预期的。

属性计算

调试器可以在任何变量窗口中计算属性。 不过,在调试器中计算属性可能会有副作用,从而产生意外的、不想要的结果。 若要防止意外计算所产生的副作用,可以在**“选项”**对话框中关闭属性计算。

WebMethods

不能从调试器窗口调用 WebMethods。

请参见

其他资源

调试器中的表达式