当前位置: 首页 > 知识库问答 >
问题:

C#是否保证分支嵌套表达式的求值顺序?

任飞龙
2023-03-14

显然,C#同时处理嵌套表达式和链式表达式。如果嵌套和/或链接是线性的,那么很明显表达式的计算顺序是:

Foo(Bar(Baz())。Bop())只能按以下顺序计算:

  • Baz()
  • Bop()
  • Bar()
  • Foo()

但如果筑巢不是线性的呢?考虑:Foo(Baz())。条形图(Bop())

显然,以下内容必须是正确的:

  • BazFoo
  • 之前
  • Foo
  • 之前
  • Bop之前的Bar

但目前尚不清楚何时会评估Bop。以下任何一项都是可行的命令:

  • 可能性#1
    • Bop()
    • Baz()
    • Foo()
    • Bar()
    • Baz()
    • Baz()

    我的直觉是,第三种选择可能是正确的。i、 e.在开始评估任何之前,它将完全评估Foo(Baz())。条形图(Bop())

    虽然我当然可以测试个人情况,看看会发生什么,但这并不能告诉我我的猜测是否总是正确的?

    但我的问题是:分支嵌套表达式的评估顺序是作为C#语言规范的一部分定义的,还是留给编译器的情境判断?

    如果不是,它至少是确定性的吗?

共有1个答案

陈奇希
2023-03-14

您可以在规范的第11节中找到答案。

具体来说,11.6.6函数成员调用说明:

函数成员调用的运行时处理由以下步骤组成,M是函数成员,如果M是实例成员,E是实例表达式:
。。。

  • E被计算。如果此计算导致异常,则不执行进一步的步骤。
  • 参数列表按照§11.6.2中的描述进行计算。

因此,给定表达式E. M(A),在计算A之前,将完全计算E

对于Foo(Baz())。Bar(Bop())案例,如果我们看的是Bar(因此EFoo(Baz())MBar,而参数列表是Bop()),这意味着FooE)必须在Bop(参数列表)被评估之前得到充分评估,这意味着“可能性#3”是正确的。

还有11.6.2.3参数列表的运行时评估:

函数成员调用的运行时处理过程中(§11.6.6),参数列表的表达式或变量引用按从左到右的顺序计算

所以在表达式M(A,B)中,AB被计算之前被完全计算。

 类似资料:
  • 问题内容: 我有以下代码片段: 我知道在C ++中,您被教导不要依赖子表达式的求值顺序,因为它不能保证完全是任何顺序。因此,此代码将是错误的,并且不能保证条件中表达式所产生的布尔值是真实的(例如,可以在第一次等式测试中对y进行递增运算)。由于我是在Java认证书中阅读此代码的,因此我认为Java并非如此。.我的意思是,我是否保证Java的评估顺序始终是从左到右?因此,以上表达式应始终为true。

  • 我有以下代码片段: 我知道在C++中,你被教导不要依赖子表达式的求值顺序,因为它不能保证是任何顺序。因此这段代码是错误的,并且条件中的表达式所产生的布尔值不能保证为真(例如,在第一个相等性测试中计算y之前,可以增加y)。因为我是在Java认证书上读到这段代码的,所以我假设Java不是这样的。我的意思是,我能保证Java的计算顺序总是从左到右吗?所以上面的表达式应该总是产生true。

  • 问题内容: 我有一个记录ID列表,我想要从SQL Server 2008中的表中检索单个值。 我的查询是: “ IN”表达式包含数百个ID。ID列是表的主键。 如果我的桌子是这样的: 我将始终获得在“ IN”表达式中按出现顺序排序的结果的结果吗?如果没有,我正在考虑做: 问题答案: 不,您将不会总是获得基于的结果。 要明确,并添加一个子句。

  • 问题内容: SQLite是否支持公用表表达式? 我想运行这样的查询: 问题答案: 从Sqlite版本3.8.3开始,SQLite支持公用表表达式。 变更记录 指示

  • 问题内容: 我认为使用某种顺序才有意义。我想做的是在视图中包括该子句,以便该视图上的所有s都可以忽略它。但是,我担心该订单不一定会延续到,因为它没有指定订单。 是否存在一种情况,即视图指定的顺序不会反映在该视图上的select结果中(该视图中的order by子句除外)? 问题答案: 您不能指望没有显式子句的任何查询中的行顺序。如果查询有序视图,但没有包括子句,则如果它们的顺序正确,请感到惊喜,并

  • 我正在为PHPs'编写一个正则表达式函数,以查找包含字符串中所有内容的所有。(在我的例子中,我只有一个if,因为它不是问题的根源。) 以下是到目前为止我得到的信息: 模式: 字符串: 当前输出: 预期输出: 问题是:正则表达式会找到第一个右括号。 我哪里做错了?如何处理嵌套括号? 演示:https://regex101.com/r/SgBqbW/1