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)
在调试器中计算函数实际上是对函数调用并执行代码。 如果函数具有副作用(例如,分配内存或更改全局变量的值),则在调试器窗口中计算函数将更改程序的状态,这可能生成意外的结果。
在对重载函数设置断点时,断点的位置取决于指定函数的方式。 如果只指定函数名称,则调试器将对相应函数名称的每个重载设置一个断点。 如果指定完整签名、函数名称和完整参数列表,则调试器将对指定重载设置一个断点。
运算符
调试器将正确地计算大多数内置运算符,包括:
关系运算符:(expr1 >expr2、expr1 < expr2、expr1 <= expr2、expr1 => expr2、expr1 == expr2、expr1 != expr2)。
布尔运算符:(expr1 && expr2、expr1 || expr2)。
条件运算符:(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、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 和 sizeof 运算符,方法是将其转换为等效的 .NET Framework 函数。
typeof ( expression )
将转换为:
System.Type.GetType(expression )
调试器随后计算此转换后的表达式。
调试器不支持 sizeof 运算符。
装箱和取消装箱
调试器表达式计算器不支持 Visual C++ 中的装箱和取消装箱。 有关详细信息,请参阅装箱和取消装箱。 如果具有一个已通过装箱转换为对象的整数变量 i,则调试器会将 i 作为整数而非对象进行计算。 结果可能不是您所预期的。
属性计算
调试器可以在任何变量窗口中计算属性。 但是,在调试器中计算属性可能会有副作用,从而产生意外的、不想要的结果。 若要防止意外计算所产生的副作用,可以在**“选项”**对话框中关闭属性计算。
WebMethods
不能从调试器窗口调用 WebMethods。