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++式エバリュエーターがAssembly-Language式を処理していることがわかります。アセンブリ言語のリンクをたどると、BYはアセンブリ言語式のBYTEの略であることがわかります。だから、ちょうど別のマイクロソフトのコックアップ

于 2011-01-10T17:13:18.117 に答える
7

ここに表示されているのは、C++式エバリュエーターによる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 に答える