C++ 表达式解析器支持所有 C++ 表达式语法形式。包括所有数据类型(包括指针,浮点数,数组)以及 C++ 所有一元和二元运算符。
?? 默认是对C++表达式求值
C++ 表达式中的数值
除非另有说明,C++ 表达式中的数值被当作十进制来解析。添加 0x 前缀指定十六进制整数。添加 0(零)指定八进制整这点比较坑,一定要特别注意,因为大家习惯是用16进制的
0:000> ? 1 Evaluate expression: 1 = 00000001 0:000> ?? 1 int 1 0:000> ?? 1f float 1 0:000> ? 1f Evaluate expression: 31 = 0000001f
0:000> ?? 0x1f int 31可以看到c++表达式输出的结果都是10进程
调试器使用的缺省基数不影响 C++ 表达式的输入,也就是n 16对C++的输出没有任何影响
C++ 表达式中的字符和字符串
输入字符时用单引号(')括住。可以使用标准的 C++ 转义字符。
输入字符串时用双引号(")括住。可以在字符串中使用转义字符序列 " 。然而,字符串对于表达式求值器无意义
0:000> ?? 'c' char 99 'c' 0:000> ?? "c:" EOF in literal '"c:"'
C++ 表达式中的运算符
可以用圆括号来掩盖优先级规则数据类型按C++语言的常规方法来指定。可以识别表示数组([ ]),指针成员(->),UDT(译注:用户定义类型,User defined types)成员(.),以及所有的类成员(::)。支持所有算术运算符,包括赋值运算符和带副作用的运算符。但是,不允许使用new、delete 和throw 运算符,当然,也不能调用函数。
支持指针运算,也可以正确计算偏移。注意不能给函数指针加上某个偏移值 (如果需要这样做,首先把它强制转换为指向字符的指针)。
Class :: Member Class ::~Member :: Name |
类成员 类成员(析构函数) 全局的 |
0:002> ?? VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest <function> 0x00402c00 void VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest+0( void ) 0:002> ?? g_NewWinVerifyTrust <function> * 0x00000000我们可以对比下用MASM规则来:
0:002> ? VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest Evaluate expression: 4205568 = 00402c00 0:002> ? g_NewWinVerifyTrust Evaluate expression: 4290536 = 004177e8可以看到,都变成求值了
Structure . Field Pointer -> Field Name [integer] LValue ++ LValue -- dynamic_cast <type>(Value) static_cast <type>(Value) reinterpret_cast <type>(Value) const_cast <type>(Value) |
结构成员 被引用结构的成员 数组下标 加一(计算后) 减一(计算后) 类型强制转换(总会执行) 类型强制转换(总会执行) 类型强制转换(总会执行) 类型强制转换(总会执行) |
0:000> ?? WinTrustData struct _WINTRUST_DATA +0x000 cbStruct : 0x2c +0x004 pPolicyCallbackData : (null) +0x008 pSIPClientData : (null) +0x00c dwUIChoice : 2 +0x010 fdwRevocationChecks : 0 +0x014 dwUnionChoice : 1 +0x018 pFile : 0x0012f464 WINTRUST_FILE_INFO_ +0x018 pCatalog : 0x0012f464 WINTRUST_CATALOG_INFO_ +0x018 pBlob : 0x0012f464 WINTRUST_BLOB_INFO_ +0x018 pSgnr : 0x0012f464 WINTRUST_SGNR_INFO_ +0x018 pCert : 0x0012f464 WINTRUST_CERT_INFO_ +0x01c dwStateAction : 0 +0x020 hWVTStateData : (null) +0x024 pwszURLReference : (null) +0x028 dwProvFlags : 0 0:000> ?? WinTrustData.pFile struct WINTRUST_FILE_INFO_ * 0x0012f464 +0x000 cbStruct : 0x10 +0x004 pcwszFilePath : 0x00278680 -> 0x65 +0x008 hFile : (null) +0x00c pgKnownSubject : (null)
0:000> ?? static_cast<int>(&WinTrustData) int 1242152 0:000> ? WinTrustData Evaluate expression: 1242152 = 0012f428
Value * Value Value / Value Value % Value |
乘法 除法 求余 |
0:000> ?? 4*2 int 8 0:000> ?? 4 / 2 int 2 0:000> ?? 4/2 int 2 0:000> ?? 4%2 int 0
Value + Value Value - Value |
加法 减法 |
0:000> ?? 3+1 int 4 0:000> ?? 3-1 int 2
Value << Value Value >> Value |
左移位 右移位 |
0:000> ?? 2>>1 int 1 0:000> ?? 2<<1 int 4
(type) Value sizeof value sizeof( type ) ++ LValue -- LValue ~ Value ! Value - Value + Value & LValue * Value |
类型强制转换(总会执行) 表达式大小 数据类型大小 加一(计算前) 减一(计算前) 按位反 逻辑非 一元运算符,负数 一元运算符,正数 数据类型的地址 解引用,取值 |
0:000> ?? sizeof 1 unsigned int 4 0:000> ?? sizeof(WinTrustData) unsigned int 0x2c
Value < Value Value <= Value Value > Value Value >= Value |
小于(比较) 小于等于(比较) 大于(比较) 大于等于(比较) |
0:000> ?? 1<2 bool true 0:000> ?? 1<=2 bool true 0:000> ?? 1>2 bool false 0:000> ?? 1>=2 bool false
Value == Value Value != Value |
等于(比较) 不等于(比较) |
0:000> ?? 1==2 bool false 0:000> ?? 1!=2 bool true
Value & Value | 按位与 |
Value ^ Value | 按位异或(不同于 OR) |
Value | Value | 按位或 |
Value && Value | 逻辑与 |
Value || Value | 逻辑或 |
0:000> ?? 1&2 int 0 0:000> ?? 1^2 int 3 0:000> ?? 1|2 int 3 0:000> ?? 1&&2 bool true 0:000> ?? 1||2 bool true 0:000> ?? 0&&2 bool false
LValue = Value LValue *= Value LValue /= Value LValue %= Value LValue += Value LValue -= Value LValue <<= Value LValue >>= Value LValue &= Value LValue |= Value LValue ^= Value |
赋值 乘之后赋值 除之后赋值 求余之后赋值 加之后赋值 减之后赋值 左移位之后赋值 右移位之后赋值 与之后赋值 或之后赋值 异或之后赋值 |
Value ? Value : Value | 三元条件运算符 |
Value , Value | 逗号运算符。计算所有值,保留最右边的值 |
使用@@c++(...)可以显式指定括号中表达式所使用的语法规则,