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++(...)可以显式指定括号中表达式所使用的语法规则,