啊,你不喜欢一个好的三元滥用吗?:)考虑以下表达式:
true ? true : true ? false : false
Run Code Online (Sandbox Code Playgroud)
对于那些现在完全感到困惑的人,我可以告诉你,这个评估是真的.换句话说,它等同于:
true ? true : (true ? false : false)
Run Code Online (Sandbox Code Playgroud)
但这可靠吗?我能否确定在某些情况下不会出现这种情况:
(true ? true : true) ? false : false
Run Code Online (Sandbox Code Playgroud)
有些人可能会说 - 好吧,只需添加括号或完全不使用它 - 毕竟,众所周知,三元运算符是邪恶的!
当然它们是,但在某些情况下它们确实有意义.对于好奇的 - 我正在拧干通过一系列属性比较两个对象的代码.如果我像这样冷写它会很好:
obj1.Prop1 != obj2.Prop1 ? obj1.Prop1.CompareTo(obj2.Prop1) :
obj1.Prop2 != obj2.Prop2 ? obj1.Prop2.CompareTo(obj2.Prop2) :
obj1.Prop3 != obj2.Prop3 ? obj1.Prop3.CompareTo(obj2.Prop3) :
obj1.Prop4.CompareTo(obj2.Prop4)
Run Code Online (Sandbox Code Playgroud)
简洁明了.但它确实取决于三元运算符的相关性,就像第一种情况一样.括号只会使意大利面条脱离它.
那么 - 这是指定的吗?我找不到它.
我只是注意到它(<$>)的固定性infixl 4.怎么会这样?
(+1) <$> (/5) <$> [5,10] 显然从右到左.
来自http://en.cppreference.com/w/cpp/language/operator_precedence的C++运算符优先级表(我知道它不是规范性的,但标准不讨论优先级或关联性)将一元运算符标记为右/左关联.
从对不同问题的讨论中,我怀疑.将一元运算符联合起来是否有意义?
我知道赋值运算符是右关联的.
所以例如 x = y = z = 2相当于(x = (y = (z = 2)))
既然如此,我尝试了以下方法:
foo.x = foo = {a:1}
Run Code Online (Sandbox Code Playgroud)
我期望foo使用value创建对象{a:1},然后x将创建属性,该属性foo将只是foo对象的引用.
(实际上,如果我要将多个赋值语句分成两个单独的语句,会发生什么foo = {a:1};foo.x = foo;)
结果实际上是:
ReferenceError:未定义foo(...)
那么我尝试了以下内容:
var foo = {};
foo.x = foo = {a:1};
Run Code Online (Sandbox Code Playgroud)
现在我不再得到例外但是foo.x未定义!
为什么作业不按我的预期工作?
var关键字创建的变量相关联.这不是问题所在. javascript operator-precedence associativity multiple-assignment
Clickbaity标题,但它太多了,不能放弃.我有这个运算符,我希望是正确的关联:
sub infix:<?> ( Int:D \n, Int:D \m --> Int:D )
is assoc<right>
is equiv(&infix:<**>)
{ n ** m }
put "2**2**2**2 = ", 2**2**2**2;
put "2?2?2?2 = ", 2?2?2?2;
put "2? (2? (2?2) ) = ", 2? (2? (2?2) );
Run Code Online (Sandbox Code Playgroud)
这是不正确的联想:
2**2**2**2 = 65536
2?2?2?2 = 256
2? (2? (2?2) ) = 65536
Run Code Online (Sandbox Code Playgroud)
我做得不对(咳咳)?
我有以下功能:
pub fn s_v1(n: &u64) -> u64 {
let mut x: u64 = 1;
for i in 1..=*n {
x = x * (*n + i) / i;
}
x
}
Run Code Online (Sandbox Code Playgroud)
这段代码给出了正确的答案s_v1(&20) == 137846528820
但是,如果我将 for 循环中的行更改为x *= (*n + i) / i;
答案改为s_v1(&20) == 16094453760
为什么结果不同?不是x = x * y一样吗x *= y?
如果我们有一个表达式:
a $ b @ c
Run Code Online (Sandbox Code Playgroud)
$是一个左关联运算符,@是右关联运算符.它们具有相同的优先权.
这个表达式是如何解析的?作为(a $ b) @ c或作为a $ (b @ c)?
N4191提出了C++的fold-expressions.有那样的定义
(args + ...)
Run Code Online (Sandbox Code Playgroud)
是左折(即(((a0 + a1) + a2) + ...),那个
(... + args)
Run Code Online (Sandbox Code Playgroud)
是一个右折(即(... + (a8 + (a9 + a10))).然而,修订后的论文N4295颠倒了左右一元褶的定义.
问题:理由是什么?它似乎更直观(至少当你习惯于从左到右的字母表)从左到右进行评估(args + ...).
associativity ×10
c++ ×3
operators ×3
.net ×1
c# ×1
c++17 ×1
comparison ×1
expression ×1
haskell ×1
javascript ×1
parsing ×1
perl6 ×1
python ×1
raku ×1
rust ×1