标签: associativity

C#中的三元运算符关联性 - 我可以依赖它吗?

啊,你不喜欢一个好的三元滥用吗?:)考虑以下表达式:

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)

简洁明了.但它确实取决于三元运算符的相关性,就像第一种情况一样.括号只会使意大利面条脱离它.

那么 - 这是指定的吗?我找不到它.

.net c# ternary-operator associativity

17
推荐指数
2
解决办法
2143
查看次数

Python比较运算符从左到右链接/分组?

运算符优先级的Python文档说明:

同一个框组中的操作员从左到右(除了比较,包括测试,它们都具有相同的优先级和从左到右的链 - 参见比较部分......)

这是什么意思?特别:

  1. "从同一个盒子组中的操作员从左到右(除了比较......)" - 做比较不是从左到右分组?

  2. 如果比较不是从左到右分组,那么他们做了什么呢?他们"链"而不是"群体"吗?

  3. 如果比较"链"而不是"组","链接"和"分组"之间有什么区别?

  4. 什么样的例子可以证明比较运算符从左到右而不是从右到左链接?

python comparison operator-precedence associativity

16
推荐指数
1
解决办法
2309
查看次数

如何(<$>)保持关联

我只是注意到它(<$>)的固定性infixl 4.怎么会这样?

(+1) <$> (/5) <$> [5,10] 显然从右到左.

haskell associativity

16
推荐指数
1
解决办法
628
查看次数

将一元运算符联合起来是否有意义?

来自http://en.cppreference.com/w/cpp/language/operator_precedence的C++运算符优先级表(我知道它不是规范性的,但标准不讨论优先级或关联性)将一元运算符标记为右/左关联.

从对不同问题的讨论中,我怀疑.将一元运算符联合起来是否有意义?

c++ operators unary-operator associativity

15
推荐指数
1
解决办法
4830
查看次数

多项任务混淆

我知道赋值运算符是右关联的.

所以例如 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

15
推荐指数
1
解决办法
274
查看次数

为什么Perl 6的正确关联性不对?

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)

我做得不对(咳咳)?

perl6 associativity raku

14
推荐指数
1
解决办法
289
查看次数

对于整数,为什么 x = x * y / z 给出的结果与 x *= y / z 不同?

我有以下功能:

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

integer-division operator-precedence associativity rust

12
推荐指数
2
解决办法
3749
查看次数

逗号运算符必须是左关联的吗?

根据此优先级表,逗号运算符是左关联的.也就是说,a, b, c被解析为(a, b), c.这是必要的吗?会不会a, (b, c)有完全相同的行为?

c++ expression operators comma-operator associativity

11
推荐指数
1
解决办法
949
查看次数

左关联运算符与右关联运算符

如果我们有一个表达式:

a $ b @ c
Run Code Online (Sandbox Code Playgroud)

$是一个左关联运算符,@是右关联运算符.它们具有相同的优先权.

这个表达式是如何解析的?作为(a $ b) @ c或作为a $ (b @ c)

parsing operators operator-precedence associativity

11
推荐指数
2
解决办法
3721
查看次数

折叠表达式的相关性

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 + ...).

c++ associativity language-lawyer fold-expression c++17

11
推荐指数
2
解决办法
278
查看次数