我确实知道条件运算符具有右结合性,但无法理解
condition1
、 condition2
、 expression1
、 expression2
、 expression3
的流程是如何相继发生的。或者当我们假设关联性是从左到右时,评估和流程如何变化。
(condition1) ? (expression1) : ((condition2) ? (expression2) : (expression3)) ;
我向 Gemini 和 Copilot 寻求解释,他们一直重复同样的事情:
condition1
是最右边的表达方式,但不明白如何解释。或者如何以及为什么 condition1
是第一个被评估的,无论右关联性还是左关联性。
(我假设您指的是 C 编程语言系列中的条件运算符。如果您想专注于该语言,请用特定语言标记您的问题。)
让我们从最简单的情况开始,一个条件表达式:
condition ? expression1 : expression2
要计算此表达式,请按照下列步骤操作:
condition
。expression2
并评估 expression1
。expression1
并评估 expression2
。expression1
的值)或步骤 3(expression2
的值)的结果,以适用者为准。请注意,计算顺序是从左到右:首先计算
condition
,然后是 expression1
或 expression2
。
condition
是条件表达式如果
condition
中的condition ? expression1 : expression2
本身就是一个条件表达式,那么你会得到以下整体表达式:
(subcondition ? subexpression1 : subexpression2) ? expression1 : expression2
要计算此表达式,请遵循与基本情况相同的步骤,但将
condition
替换为 subcondition ? subexpression1 : subexpression2
。在第 1 步中,您将递归:
subcondition ? subexpression1 : subexpression2
。为此,请执行与基本案例中相同的步骤:
subcondition
。subexpression2
并评估 subexpression1
。subexpression1
并评估 subexpression2
。subexpression1
的值)或步骤 1.3(subexpression2
的值)的结果,以适用者为准。expression2
并评估 expression1
。expression1
并评估 expression2
。expression1
的值)或步骤 3(expression2
的值)的结果,以适用者为准。请注意,计算顺序从左到右:首先计算
subcondition
,然后是 subexpression1
或 subexpression2
,最后是 expression1
或 expression2
。
expression2
是条件表达式如果
expression2
中的condition ? expression1 : expression2
本身就是一个条件表达式,那么你会得到以下整体表达式:
condition ? expression1 : (subcondition ? subexpression1 : subexpression2)
要计算此表达式,请遵循与基本情况相同的步骤,但将
expression2
替换为 subcondition ? subexpression1 : subexpression2
。在第 3 步中,您将递归:
condition
。subcondition ? subexpression1 : subexpression2
并评估 expression1
。expression1
并评估 subcondition ? subexpression1 : subexpression2
。为此,请执行与基本案例中相同的步骤:
subcondition
。subexpression2
并评估 subexpression1
。subexpression1
并评估 subexpression2
。subexpression1
的值)或步骤 3.3(subexpression2
的值)的结果,以适用者为准。expression1
的值)或步骤 3(subcondition ? subexpression1 : subexpression2
的值)的结果,以适用者为准。请注意,计算顺序从左到右:首先计算
condition
,然后是expression1
或subcondition
,然后(仅在subcondition
情况下)subexpression1
或subexpression2
.
现在让我们看看你的原始表达式,但省略所有括号:
condition1 ? expression1 : condition2 ? expression2 : expression3
这可能有两种不同的解释:
(condition1 ? expression1 : condition2) ? expression2 : expression3
condition1 ? expression1 : (condition2 ? expression2 : expression3)
要理解的重要一点是,关联性和求值顺序是两个完全不同的概念。对于条件运算符,左结合性或右结合性仅决定您处于情况 2 还是情况 3。但在这两种情况下,计算顺序都是从左到右,首先计算
condition1
。