嵌套条件运算符结合性解释

问题描述 投票:0回答:1

我确实知道条件运算符具有右结合性,但无法理解

condition1
condition2
expression1
expression2
expression3
的流程是如何相继发生的。或者当我们假设关联性是从左到右时,评估和流程如何变化。

(condition1) ? (expression1) : ((condition2) ? (expression2) : (expression3)) ;

我向 Gemini 和 Copilot 寻求解释,他们一直重复同样的事情:

condition1
是最右边的表达方式,但不明白如何解释。或者如何以及为什么
condition1
是第一个被评估的,无论右关联性还是左关联性。

conditional-operator operator-precedence
1个回答
0
投票

(我假设您指的是 C 编程语言系列中的条件运算符。如果您想专注于该语言,请用特定语言标记您的问题。)

案例 1:基本案例

让我们从最简单的情况开始,一个条件表达式:

condition ? expression1 : expression2

要计算此表达式,请按照下列步骤操作:

  1. 评估
    condition
  2. 如果第 1 步的结果为真(或“真实”,具体取决于语言),则忽略
    expression2
    并评估
    expression1
  3. 如果步骤 1 的结果为 false(或“假”,具体取决于语言),则忽略
    expression1
    并评估
    expression2
  4. 返回步骤 2(
    expression1
    的值)或步骤 3(
    expression2
    的值)的结果,以适用者为准。

请注意,计算顺序是从左到右:首先计算

condition
,然后是
expression1
expression2

情况2:
condition
是条件表达式

如果

condition
中的
condition ? expression1 : expression2
本身就是一个条件表达式,那么你会得到以下整体表达式:

(subcondition ? subexpression1 : subexpression2) ? expression1 : expression2

要计算此表达式,请遵循与基本情况相同的步骤,但将

condition
替换为
subcondition ? subexpression1 : subexpression2
。在第 1 步中,您将递归

  1. 评估
    subcondition ? subexpression1 : subexpression2
    。为此,请执行与基本案例中相同的步骤:
    1. 评估
      subcondition
    2. 如果步骤 1.1 的结果为 true,则忽略
      subexpression2
      并评估
      subexpression1
    3. 如果步骤 1.1 的结果为 false,则忽略
      subexpression1
      并评估
      subexpression2
    4. 返回步骤 1.2(
      subexpression1
      的值)或步骤 1.3(
      subexpression2
      的值)的结果,以适用者为准。
  2. 如果步骤 1 的结果为 true,则忽略
    expression2
    并评估
    expression1
  3. 如果步骤 1 的结果为 false,则忽略
    expression1
    并评估
    expression2
  4. 返回步骤 2(
    expression1
    的值)或步骤 3(
    expression2
    的值)的结果,以适用者为准。

请注意,计算顺序从左到右:首先计算

subcondition
,然后是
subexpression1
subexpression2
,最后是
expression1
expression2

情况3:
expression2
是条件表达式

如果

expression2
中的
condition ? expression1 : expression2
本身就是一个条件表达式,那么你会得到以下整体表达式:

condition ? expression1 : (subcondition ? subexpression1 : subexpression2)

要计算此表达式,请遵循与基本情况相同的步骤,但将

expression2
替换为
subcondition ? subexpression1 : subexpression2
。在第 3 步中,您将递归

  1. 评估
    condition
  2. 如果步骤 1 的结果为 true,则忽略
    subcondition ? subexpression1 : subexpression2
    并评估
    expression1
  3. 如果步骤 1 的结果为 false,则忽略
    expression1
    并评估
    subcondition ? subexpression1 : subexpression2
    。为此,请执行与基本案例中相同的步骤:
    1. 评估
      subcondition
    2. 如果步骤 3.1 的结果为 true,则忽略
      subexpression2
      并评估
      subexpression1
    3. 如果步骤 3.1 的结果为 false,则忽略
      subexpression1
      并评估
      subexpression2
    4. 返回步骤 3.2(
      subexpression1
      的值)或步骤 3.3(
      subexpression2
      的值)的结果,以适用者为准。
  4. 返回步骤 2(
    expression1
    的值)或步骤 3(
    subcondition ? subexpression1 : subexpression2
    的值)的结果,以适用者为准。

请注意,计算顺序从左到右:首先计算

condition
,然后是
expression1
subcondition
,然后(仅在
subcondition
情况下)
subexpression1
subexpression2
.

左结合性与右结合性

现在让我们看看你的原始表达式,但省略所有括号:

condition1 ? expression1 : condition2 ? expression2 : expression3

这可能有两种不同的解释:

  1. 左联想:
    (condition1 ? expression1 : condition2) ? expression2 : expression3
    • 这是上面的案例2。
  2. 右结合词:
    condition1 ? expression1 : (condition2 ? expression2 : expression3)
    • 这是上面的情况3。

要理解的重要一点是,关联性求值顺序是两个完全不同的概念。对于条件运算符,左结合性或右结合性仅决定您处于情况 2 还是情况 3。但在这两种情况下,计算顺序都是从左到右,首先计算

condition1

© www.soinside.com 2019 - 2024. All rights reserved.