为何curr1?.val ?? 0 + curr2?.val ?? 0返回2而非7?
问题原因:运算符优先级与结合性
你的问题核心是C#运算符的优先级和结合性导致表达式执行顺序和预期不符。
原表达式的实际执行流程
在C#中,运算符优先级从高到低的关键顺序为:?.(空传播运算符)> +(加法运算符)> ??(空合并运算符),且??是左结合的(即从左到右依次计算)。
原表达式curr1?.val ?? 0 + curr2?.val ?? 0会按以下步骤执行:
- 第一步:计算所有
?.操作,curr1?.val得到2,curr2?.val得到5; - 第二步:执行优先级更高的
+操作,计算0 + 5,结果为5; - 第三步:表达式简化为
2 ?? 5 ?? 0; - 第四步:按左结合规则计算
2 ?? 5,空合并运算符返回第一个非空值,这里2非空,结果为2; - 第五步:计算
2 ?? 0,结果仍为2。
这就是最终结果为2而非预期7的原因。
正确表达式的逻辑
你使用的(curr1?.val ?? 0) + (curr2?.val ?? 0)能得到正确结果,是因为括号强制改变了执行优先级:先分别计算两个空合并操作,得到2和5,再执行加法运算得到7。
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

