2011-01-10 33 views
5

Cân nhắc C++ của tôi dưới đây:biểu Visual Studio chứa một thuật ngữ có tên là "bởi" không thể được đánh giá trong cửa sổ xem

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

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

    return 0; 
} 

mà hoạt động tốt. Điều buồn cười là với biến "by". Nếu tôi cố gắng thêm đồng hồ cho một biểu thức đơn giản có chứa, kết quả sẽ là CXX0030: Lỗi: biểu thức không thể được đánh giá.

Ví dụ, trên một breakpoint trên return 0, nếu tôi thêm những chiếc đồng hồ sau tôi nhận được kết quả nêu:

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 

Điều này xảy ra trên VS2010, VS2008 trên nhiều máy tính.

Vì vậy, ngoài tò mò, điều gì đang xảy ra với "bởi"? Có một số nhà điều hành kỳ lạ không? Tại sao bx không được điều trị như vậy?

(Tôi đã thử google về vấn đề này nhưng nó là khá khó khăn để có được một số hit liên quan các cụm từ như "bằng")

+2

tập tin một báo cáo lỗi, tôi có nó ở đây quá – stijn

+0

Ahhh, hy vọng của tôi là rằng đây là một số loại tính năng ẩn: D, không chỉ một lỗi thông thường. –

+1

"Toán hạng còn thiếu" đặc biệt là nâng cao lông mày. – aschepler

Trả lời

7

Những gì bạn thấy ở đây là việc thực hiện Trình đánh giá biểu thức C++ của toán tử BY. Việc bạn sử dụng biểu thức BY đang được hiểu là toán tử thay vì biến cục bộ.

tham khảo: http://msdn.microsoft.com/en-us/library/56638b75.aspx

Rất nhiều cuộc thảo luận đã đi vào hay không hành vi này là một lỗi hoặc do thiết kế. Rất tiếc, chỉ những người đã triển khai tính năng mới có thể thực sự được trả lời. Như không hài lòng vì nó là cho kịch bản này có thể là lý do hợp lệ tại sao điều này đã được thực hiện một cách rõ ràng (chi phí của sự định hướng đến tâm). Hoặc điều này đơn giản có thể là sự giám sát của người triển khai. Một lần nữa họ chỉ biết câu trả lời.

Nếu điều này không giống như lỗi cho bạn thì vui lòng thực hiện lỗi khi kết nối. Đây là cách tốt nhất để có được ý kiến ​​của bạn nghe và rất có khả năng nhóm đã không bao giờ nhận được bất kỳ thông tin phản hồi về hành vi này (không thể tìm thấy bất kỳ trong tìm kiếm của tôi).

+0

"Hành vi này là do thiết kế." Như tôi đã nói ở một nơi khác, chỉ một con gà trống khác của Microsoft. Thật là một quyết định thiết kế ngu ngốc! – TonyK

+0

@TonyK cho phép một tập hợp toàn bộ chức năng gỡ lỗi với chi phí không thể gỡ lỗi một biến được đặt tên rất cụ thể ... Tôi sẽ gọi đó là chiến thắng. Có, họ có thể đã làm nhiều hơn để giảm bớt kịch bản này nhưng với sự dễ dàng cực đoan của công việc xung quanh nó vẫn là một chiến thắng. – JaredPar

+0

Làm việc xung quanh? Những gì làm việc xung quanh? Các công việc xung quanh sẽ được yêu cầu rằng biểu thức ngôn ngữ hội được trước bởi một nhân vật đặc biệt. '@', ví dụ. Đó có phải là một shim? Tôi không quen với thuật ngữ này. – TonyK

8

Bị hấp dẫn bởi điều này, tôi đã làm một số đào. Từ this link, chúng ta thấy rằng bộ đánh giá biểu thức C/C++ gốc trong trình gỡ lỗi xử lý các biểu thức Ngôn ngữ-Assembly; theo sau Assembly-language link, chúng tôi phát hiện ra rằng BY viết tắt của BYTE trong một biểu thức Ngôn ngữ hội. Vì vậy, chỉ cần một con gà trống khác của Microsoft

+0

Đã cuộn lại các chỉnh sửa và các nhận xét đã xóa để không có sự gián đoạn nào giữa hai phần. Hãy tận hưởng huy hiệu! :) –

+0

@Bill the Lizard: Tôi hy vọng bạn không phiền nếu tôi gọi cho bạn một fart cũ nhàm chán. – TonyK

+0

@TonyK: Ra khỏi bãi cỏ của tôi !!! ;) –

4

Những gì bạn đang chạy vào là của debugger 'memory operator':

In native C++, debugger expressions do support the following additional operators:

  • The context operator ({ }) to specify the context of a symbol. For more information, see Context Operator (C/C++ Language Expressions).

  • Memory operators (BY, WO, and DW) to access memory. Memory operators have the lowest precedence of any operator. The memory operators are useful mainly in debugging assembly-language code.

Các vấn đề liên quan