5

考虑下面我的 C++ 代码:

int _tmain(int argc, _TCHAR* argv[])
{
    int by = 10;
    printf("%d\n", by);

    int bx = 20;
    printf("%d\n", (by + bx));

    return 0;
}

效果很好。有趣的是“by”变量。如果我尝试为包含 by 的简单表达式添加监视,结果将是 CXX0030:错误:无法评估表达式。

例如,在 上的断点上return 0,如果我添加以下手表,我会得到提到的结果:

by : 10
bx : 20
by + 5 : CXX0030: Error: expression cannot be evaluated
bx + 5 : 25
by + bx : CXX0030: Error: expression cannot be evaluated
(by) + bx : 30
by + (bx) : CXX0030: Error: expression cannot be evaluated
bx + (by) : CXX0014: Error: missing operrand

这发生在多台计算机上的 VS2010、VS2008 上。

那么,出于好奇,“by”发生了什么?它是某种奇怪的运算符吗?为什么 bx 没有得到同样的待遇?

(我已经在这方面尝试过谷歌,但很难用“by”之类的术语获得一些相关的点击)

4

3 回答 3

8

对此很感兴趣,我做了一些挖掘工作。从这个链接中,我们看到调试器中的原生 C/C++ 表达式求值器处理汇编语言表达式;在汇编语言链接之后,我们发现 BY 是汇编语言表达式中 BYTE 的缩写。所以只是另一个微软的公鸡

于 2011-01-10T17:13:18.117 回答
7

您在这里看到的是 C++ Expression Evaluator 对BY运算符的实现。您对表达式BY的使用被解释为运算符而不是局部变量。

参考:http: //msdn.microsoft.com/en-us/library/56638b75.aspx

很多讨论都在讨论这种行为是错误还是设计。不幸的是,这只能由实现该功能的人真正回答。尽管对于这种情况令人不满意,但明确地这样做可能有正当的理由(想到消除歧义的成本)。或者这可能只是实施者的疏忽。同样只有他们知道答案。

如果这对您来说确实是一个错误,那么请在连接时提交一个错误。这是听取您意见的最佳方式,并且团队很可能从未收到过有关此行为的任何反馈(在我的搜索中找不到任何反馈)。

于 2011-01-10T17:16:36.537 回答
4

您遇到的是调试器的“内存运算符”

在本机 C++ 中,调试器表达式确实支持以下附加运算符:

  • 上下文运算符 ({ }) 用于指定符号的上下文。有关详细信息,请参阅上下文运算符(C/C++ 语言表达式)。

  • 用于访问内存的内存操作符(BY、WO 和 DW)。内存运算符的优先级是所有运算符中最低的。内存运算符主要用于调试汇编语言代码。

于 2011-01-10T17:23:59.793 回答