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