簡體   English   中英

C#預處理器指令中運算符的優先級是什么?

[英]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語法。

  1. 括號,常量( truefalse )和條件符號( PLATFORM_WINDOWSDEBUG等)
  2. 一元!
  3. 平等==!=
  4. &&
  5. 或者||

它還說:

在預處理表達式中引用時,定義的條件編譯符號的布爾值為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM