2014-06-20 17 views
5

Nếu tôi có một đoạn mã được viết bằng C# được bao bọc trong chỉ thị #if, ưu tiên (nếu có) được áp dụng cho bất kỳ toán tử boolean nào có thể được sử dụng trong chỉ thị đó?Ưu tiên của các toán tử trong Chỉ thị tiền xử lý C# là gì?

Nói cách khác:

#if DEBUG || MYTEST && PLATFORM_WINDOWS 
// ... Some code here 
#endif 

sẽ có được chỉ đơn giản là đánh giá trái sang phải như

#if (DEBUG || MYTEST) && PLATFORM_WINDOWS 

Và tương tự, sẽ

#if PLATFORM_WINDOWS && DEBUG || MYTEST 

Được đánh giá là

#if (PLATFORM_WINDOWS && DEBUG) || MYTEST 

Hoặc có một số thứ tự ưu tiên cho & & so với ||?

Chỉnh sửa: Để rõ ràng, tôi biết rõ rằng tôi có thể tự chạy mã để kiểm tra và tôi có. Tôi đang tìm một câu trả lời cung cấp cho tôi một cái gì đó chính thức - một tài liệu tham khảo tài liệu hoặc tương tự, mà có thể cho tôi một sự hiểu biết sâu hơn về cơ chế cơ bản của chỉ thị. Tôi muốn biết nếu có một hành vi cụ thể dự định hoặc nếu điều này hoàn toàn là một cái gì đó không xác định.

+4

Dấu ngoặc đơn IMO nên được sử dụng dù sao, để tránh suy nghĩ chi phí và sự nhầm lẫn như vậy – thumbmunkeys

+5

Tại sao không chạy một số thử nghiệm và cho chúng tôi biết?Đây là một cái gì đó bạn có thể dễ dàng tìm ra cho chính mình. –

+0

Giải pháp đơn giản, cũng có những lợi ích dễ đọc lớn, là chỉ cần tự mình lồng ghép nó. – qaphla

Trả lời

12

2.5.2 biểu thức Pre-chế biến

đánh giá của một biểu thức tiền xử lý luôn mang lại một giá trị boolean . Các quy tắc của đánh giá đối với một biểu thức tiền xử lý là như đối với một biểu thức hằng số (§7.19), ngoại trừ việc chỉ tổ chức người dùng định nghĩa có thể được tham chiếu là có điều kiện ký tự biên soạn

7,19 biểu thức hằng số

việc đánh giá thời gian biên dịch các biểu thức liên tục sử dụng các quy tắc tương tự như thời gian chạy đánh giá các biểu thức không liên tục *, ngoại trừ việc đánh giá thời gian chạy có thể đã ném một ngoại lệ, việc đánh giá thời gian biên dịch gây ra một lỗi biên dịch thời gian xảy ra.

Vì vậy, cùng một toán tử ưu tiên áp dụng cho các biểu thức xử lý trước, biểu thức không đổi và đánh giá thời gian chạy.

7.3.1 Điều Hành ưu tiên và associativity

(...)

7,11 logic AND &

7,11 logic XOR^

7.11 logic OR |

7,12 Conditional VÀ & &

7,12 Conditional HAY ||

(...)

Từ cao nhất để ưu tiên thấp nhất.

+0

Chà nhanh - đó là thông số kỹ thuật cũ tôi đã xem tại http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf có 2.5.2 tại 9.5.2 vv – Andrew

+2

Đó là thông số kỹ thuật của C# 5.0. Một trong những bạn liên kết là 2006 :) C# spec là một phần của tài nguyên cài đặt VS bây giờ: http://msdn.microsoft.com/en-us/library/ms228593.aspx – MarcinJuraszek

+0

ah giải thích nó - suy nghĩ số thấp hơn có nghĩa là cũ hơn – Andrew

0

Tôi tin rằng toán tử & & có mức ưu tiên cao hơn || Toán tử trong C# như được hiển thị ở đây, http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx.

Vì vậy, mã của bạn sau đó sẽ được đánh giá:

#if DEBUG || MYTEST && PLATFORM_WINDOWS 
// ... Some code here 
#endif 

sẽ được đánh giá là

#if (MYTEST && PLATFORM_WINDOWS) || DEBUG 
// ... Some code here 
#endif 
+0

Điều này đúng với các biểu thức C# (và hầu hết mọi ngôn ngữ khác), nhưng tôi không thể tìm thấy một tham chiếu rõ ràng cho biết điều này đúng với các điều kiện tiền tố C# * preprocess *. Hiển thị kết quả thử nghiệm thực tế sẽ thêm bằng chứng cho xác nhận quyền sở hữu, tìm kiếm tham chiếu chính thức/đặc điểm kỹ thuật, thậm chí nhiều hơn thế. – user2864740

+0

@ user2864740 Đó chính xác là những gì OP được yêu cầu làm trong các bình luận chống lại câu hỏi! – ClickRick

7

Xem 2.5.2 biểu thức Pre-chế biến trong C# Language Specification Phiên bản 5.0.

Đặc điểm kỹ thuật không nói về quyền ưu tiên của toán tử, nhưng nó tuân theo ngữ pháp BNF được đưa ra trong phần đó.

  1. ngoặc, hằng (true, false) và có điều kiện-ký hiệu (PLATFORM_WINDOWS, DEBUG vv)
  2. unary !
  3. Bình đẳng ==, !=
  4. &&
  5. Hoặc ||

Nó cũng nói:

Khi tham chiếu trong một biểu thức tiền xử lý, một biểu tượng biên soạn có điều kiện xác định có giá trị boolean true, và một biểu tượng biên soạn có điều kiện xác định có giá trị boolean false.

Đánh giá biểu thức tiền xử lý luôn mang lại giá trị boolean.Các quy tắc đánh giá cho một biểu thức tiền xử lý giống như các biểu thức liên tục (§7.19), ngoại trừ các thực thể do người dùng định nghĩa chỉ có thể được tham chiếu là các biểu tượng biên dịch có điều kiện.

1

Các ưu tiên trong chỉ thị tiền xử lý là giống như usual precedence: && có độ ưu tiên cao hơn ||. Để chứng minh điều này, chạy đoạn mã sau:

#undef A 
#define B 
#define C 
#if A && B || C 
    Console.WriteLine(1); 
#endif 
#if (A && B) || C 
    Console.WriteLine(2); 
#endif 
#if A && (B || C) 
    Console.WriteLine(3); 
#endif 
#if B || C && A 
    Console.WriteLine(4); 
#endif 
#if B || (C && A) 
    Console.WriteLine(5); 
#endif 
#if (B || C) && A 
    Console.WriteLine(6); 
#endif 

Đầu ra là:

1 
2 
4 
5 

nào cho thấy dấu ngoặc đơn là tương đương khi họ đang quanh &&, không phải là hai mục bên trái.

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