我对流代码的结果感到困惑:
bool? _true = true;
bool? val1 = _true ?? true && false; //true
bool? val2 = (_true ?? true) && false; //false
我认为结果应该是一样的,任何人都可以解释诸如行为? 我注意到它至少在c#和dart中都相同,因此这应该是这样做的充分理由。
答案 0 :(得分:12)
这是由于operator precedence导致&&
操作在??
之前执行。因此,您的第一行等效于:
bool? val1 = _true ?? (true && false);
答案 1 :(得分:5)
null-coalescing运算符的优先级较低。在第一个示例中,true && false
的值为false
,剩下的true ?? false
的值为true
。
在第二个示例中,首先评估括号(到true
),剩下的true && false
产生false
。
答案 2 :(得分:5)
逻辑和运算符(&&
)的优先级高于空合并运算符(??
)。
所以
bool? val1 = _true ?? true && false; //true
等于_true ?? (true && false)
。由于_true
不为null,因此null合并运算符将返回该值(true
)。
第二种情况
bool? val2 = (_true ?? true) && false; //false
方括号中的部分再次为true
,但与false
进行与运算得到false
。
答案 3 :(得分:3)
如果在第一种情况下添加隐式括号,则更有意义
bool? _true = true;
bool? val1 = _true ?? (true && false); //true
bool? val2 = (_true ?? true) && false; //false
由于_true
不为null,因此??
之后没有任何评估。