[英]What is the precedence of operators in C# Preprocessor Directives?
如果我在C#中用#if
指令編寫了一段代碼,那么在該指令中可能使用的任何布爾運算符中應用了什么(如果有的話)優先級?
換一種說法:
#if DEBUG || MYTEST && PLATFORM_WINDOWS
// ... Some code here
#endif
這將簡單地從左到右評估為
#if (DEBUG || MYTEST) && PLATFORM_WINDOWS
同樣,願意
#if PLATFORM_WINDOWS && DEBUG || MYTEST
被評估為
#if (PLATFORM_WINDOWS && DEBUG) || MYTEST
或者&& vs ||有一些優先順序嗎?
編輯:要清楚,我很清楚我可以自己運行代碼來測試它,而且我有。 我正在尋找一個給我正式的答案 - 對文檔等的參考,這可以讓我更深入地理解指令的基本機制。 我想知道是否存在特定的預期行為,或者這是否純粹是未定義的行為。
2.5.2預處理表達式
對預處理表達式的評估總是產生布爾值。 預處理表達式的評估規則與常量表達式(第7.19節)的評估規則相同 ,只是可以引用的唯一用戶定義實體是條件編譯符號
7.19常量表達式
常量表達式的編譯時評估使用與非常量表達式*的運行時評估相同的規則 ,但運行時評估會引發異常的情況除外,編譯時評估會導致編譯時錯誤。
因此,相同的運算符優先級適用於預處理表達式,常量表達式和運行時評估。
7.3.1運算符優先級和關聯性
(......)
7.11邏輯AND&
7.11邏輯XOR ^
7.11邏輯OR |
7.12條件AND &&
7.12條件OR ||
(......)
從最高到最低優先級。
請參閱2.5.2 C#語言規范版本5.0中的預處理表達式 。
規范沒有討論運算符優先級,但它遵循該部分給出的BNF語法。
true
, false
)和條件符號( PLATFORM_WINDOWS
, DEBUG
等) !
==
, !=
&&
||
它還說:
在預處理表達式中引用時,定義的條件編譯符號的布爾值為true,未定義的條件編譯符號的布爾值為false。
對預處理表達式的評估總是產生布爾值。 預處理表達式的評估規則與常量表達式(第7.19節)的評估規則相同,只是可以引用的唯一用戶定義實體是條件編譯符號。
預處理程序指令的優先級與通常的優先級相同: &&
的優先級高於||
。 為了演示這一點,請運行以下代碼:
#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
輸出是:
1
2
4
5
這表明括號在&&
附近是等價的,而不是左邊的兩個項目。
我相信&&運算符的優先級高於|| C#中的運算符如此處所示, http://msdn.microsoft.com/en-us/library/aa691323(v = vs.71).aspx 。
那么您的代碼將被評估:
#if DEBUG || MYTEST && PLATFORM_WINDOWS
// ... Some code here
#endif
將被評估為
#if (MYTEST && PLATFORM_WINDOWS) || DEBUG
// ... Some code here
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.