C#预处理器指令中运算符的优先级是什么?

Blo*_*tor 7 c# operator-precedence c-preprocessor

如果我有一段用C#编写的代码包装在一个#if指令中,那么什么(如果有的话)优先权应用于可能在该指令中使用的任何布尔运算符?

换一种说法:

#if DEBUG || MYTEST && PLATFORM_WINDOWS
// ... Some code here
#endif
Run Code Online (Sandbox Code Playgroud)

这将简单地从左到右评估为

#if (DEBUG || MYTEST) && PLATFORM_WINDOWS
Run Code Online (Sandbox Code Playgroud)

同样,愿意

#if PLATFORM_WINDOWS && DEBUG || MYTEST
Run Code Online (Sandbox Code Playgroud)

被评估为

#if (PLATFORM_WINDOWS && DEBUG) || MYTEST
Run Code Online (Sandbox Code Playgroud)

或者&& vs ||有一些优先顺序吗?

编辑:要清楚,我很清楚我可以自己运行代码来测试它,而且我有.我正在寻找一个给我正式的答案 - 对文档等的参考,这可以让我更深入地理解指令的基本机制.我想知道是否存在特定的预期行为,或者这是否纯粹是未定义的行为.

Mar*_*zek 12

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 ||

(......)

从最高到最低优先级.

  • 它来自C#5.0规范.您链接到的那个是2006 :) C#spec现在是VS安装资源的一部分:http://msdn.microsoft.com/en-us/library/ms228593.aspx (2认同)

Cod*_*aos 7

请参阅2.5.2 C#语言规范版本5.0中的预处理表达式.

规范没有讨论运算符优先级,但它遵循该部分给出的BNF语法.

  1. 括号,常数(true,false)和条件符号(PLATFORM_WINDOWS,DEBUG等)
  2. 一元 !
  3. 平等==,!=
  4. &&
  5. 要么 ||

它还说:

在预处理表达式中引用时,定义的条件编译符号的布尔值为true,未定义的条件编译符号的布尔值为false.

对预处理表达式的评估总是产生布尔值.预处理表达式的评估规则与常量表达式(第7.19节)的评估规则相同,只是可以引用的唯一用户定义实体是条件编译符号.