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 ||
(......)
从最高到最低优先级.
请参阅2.5.2 C#语言规范版本5.0中的预处理表达式.
规范没有讨论运算符优先级,但它遵循该部分给出的BNF语法.
true,false)和条件符号(PLATFORM_WINDOWS,DEBUG等)!==,!=&&||它还说:
在预处理表达式中引用时,定义的条件编译符号的布尔值为true,未定义的条件编译符号的布尔值为false.
对预处理表达式的评估总是产生布尔值.预处理表达式的评估规则与常量表达式(第7.19节)的评估规则相同,只是可以引用的唯一用户定义实体是条件编译符号.