- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 C# 分析器和编译器的工作原理。
根据文档,像 pre-inc 和 post-inc 这样的一元运算符应该只接受变量、属性和索引器。
有趣的是,它们也接受 ParanthesisedExpressions,例如代码++(x);
这有语法原因吗?除了 ParanthesizedExpressionSyntax 在语义上等同于属性/索引器/变量之外,是否还有++(..something here..) 起作用的其他情况?
最佳答案
这是因为C#语言规范允许。 preincrement operator的规范是:
pre_increment_expression
: '++' unary_expression
;
以及 unary_expression 的规范是:
unary_expression
: primary_expression
| null_conditional_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
| '~' unary_expression
| pre_increment_expression
| pre_decrement_expression
| cast_expression
| await_expression
| unary_expression_unsafe
;
最后,primary_expression允许使用括号:
primary_expression
: primary_no_array_creation_expression
| array_creation_expression
;
primary_no_array_creation_expression
: literal
| interpolated_string_expression
| simple_name
| parenthesized_expression <<--- parenthesized expression
| member_access
| invocation_expression
| element_access
| this_access
| base_access
| post_increment_expression
| post_decrement_expression
| object_creation_expression
| delegate_creation_expression
| anonymous_object_creation_expression
| typeof_expression
| checked_expression
| unchecked_expression
| default_value_expression
| nameof_expression
| anonymous_method_expression
| primary_no_array_creation_expression_unsafe
;
现在的问题是:为什么 pre_increment_expression
应该允许 unary_expression
?因为替代方案将更难指定、开发和测试。另一种选择是编写如下内容:
pre_increment_expression
: '++' pre_increment_expression_allowed
;
pre_increment_expression_allowed
: element_access
| member_access
| some other expressions
;
如果您不重用现有表达式,则必须考虑您想要允许的所有表达式,这可能会变得非常复杂,然后开发新的语法树解析来支持该表达式。
复杂的示例:
请注意,可以编写以下内容(虽然没有多大意义,但仍然如此):
void Main()
{
++(new MyClass().Prop);
}
public class MyClass
{
public int Prop {get;set;}
}
关于c# - 为什么 PreIncrement 类型的 PrefixUnaryExpressionSyntax 允许使用 ParanthesisedExpressionsSyntax 的操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70567574/
我正在复习 SCJA 考试,我对这个问题和答案感到困惑。问题是运行和编译代码的结果是什么。 public class Test{ public static void main(
我在某处读到后缀运算符的优先级高于前缀运算符。 我试过这段代码: int i=4; System.out.println(--i+i++); 我预计输出为 7,因为我认为首先计算 i++ 然后计算
cppreference为可能的 for_each_n 给出以下代码执行: template InputIt for_each_n(InputIt first, Size n, UnaryFuncti
我从未见过 的用例预增和 后增量在实际代码中。我最常看到它们的唯一地方是拼图。 我的观点是,它引入了更多的困惑而不是有用。 这个 是否有任何实际用例场景? 这不能通过使用 += 来完成 y = x++
我试图了解 C# 分析器和编译器的工作原理。 根据文档,像 pre-inc 和 post-inc 这样的一元运算符应该只接受变量、属性和索引器。 有趣的是,它们也接受 ParanthesisedExp
我试图了解 C# 分析器和编译器的工作原理。 根据文档,像 pre-inc 和 post-inc 这样的一元运算符应该只接受变量、属性和索引器。 有趣的是,它们也接受 ParanthesisedExp
这个问题在这里已经有了答案: Why are these constructs using pre and post-increment undefined behavior? (14 个答案) 关
我是一名优秀的程序员,十分优秀!