Chapel 来自i==j==k的意外结果?

Chapel 来自i==j==k的意外结果?,chapel,Chapel,在这段代码中,我循环遍历3D域中的所有索引,并将“对角线”部分打印为 我的预期结果是 (0, 0, 0) (1, 1, 1) (2, 2, 2) (3, 3, 3) (4, 4, 4) (5, 5, 5) (6, 6, 6) (7, 7, 7) (8, 8, 8) (9, 9, 9) 由上面的第(2)行获得。但如果我使用第(1)行,它会给出一个意外的结果,如 (0, 0, 1) (0, 1, 0) (0, 2, 0) ... (9, 7, 0) (9, 8, 0) (9, 9, 1) 所以我

在这段代码中,我循环遍历3D域中的所有索引,并将“对角线”部分打印为

我的预期结果是

(0, 0, 0)
(1, 1, 1)
(2, 2, 2)
(3, 3, 3)
(4, 4, 4)
(5, 5, 5)
(6, 6, 6)
(7, 7, 7)
(8, 8, 8)
(9, 9, 9)
由上面的第(2)行获得。但如果我使用第(1)行,它会给出一个意外的结果,如

(0, 0, 1)
(0, 1, 0)
(0, 2, 0)
...
(9, 7, 0)
(9, 8, 0)
(9, 9, 1)
所以我想知道我是否错误地使用了
I==j==k
? (仅供参考,上面的代码是由一些Python代码激发的,比如

for i in range(10):
    for j in range(10):
        for k in range(10):

            if i == j == k:
                print( i, j, k )

它给出了(0,0,0),(1,1,1),…)

正确的,@Someprogrammerdude

==是一个二进制运算符,它是左关联的。文件如下:


将布尔值(i==j)与整数k(在i==j==k的上下文中)进行比较时,布尔值将隐式转换为整数,并执行整数相等性检查。

右上,@Someprogrammerdude

==是一个二进制运算符,它是左关联的。文件如下:


当将布尔值(i==j)与整数k(在i==j==k的上下文中)进行比较时,布尔值被隐式转换为整数,并执行整数相等性检查。

FWIW,这些是我从其他语言获得的结果(但我对每种语言的使用可能都是错误的,因此请照此理解……)

C++

D

生锈

Scala(这里“>”是REPL)

科特林

> var i = 2
> var j = 2
> var k = 2
> i == j == k
error: operator '==' cannot be applied to 'Boolean' and 'Int'
i == j == k
尼姆

朱莉娅


因此,除了Python和Julia(它们是动态类型的,所以可能有点不同),最近开发的静态类型语言似乎倾向于对使用
i==j==k
发出警告(甚至是错误)。因此,如果Python用户可能会使用Chapel,我想(对用户而言)给出一些警告(甚至错误?)消息可能会有所帮助。

FWIW,这些是我从其他语言获得的结果(但我对每种语言的使用可能都是错误的,所以请照此理解……)

C++

D

生锈

Scala(这里“>”是REPL)

科特林

> var i = 2
> var j = 2
> var k = 2
> i == j == k
error: operator '==' cannot be applied to 'Boolean' and 'Int'
i == j == k
尼姆

朱莉娅


因此,除了Python和Julia(它们是动态类型的,所以可能有点不同),最近开发的静态类型语言似乎倾向于对使用
i==j==k
发出警告(甚至是错误)。因此,如果Python用户可能会使用Chapel,我想(对于用户)给出一些警告(甚至是错误?)消息可能会有所帮助。

也许像
I==j==k
这样的比较将与
(I==j)==k
I==k
相同?换句话说,将一次比较的bool结果与非bool值进行比较。不同的编程语言做不同的事情。一定要阅读文档并学习语言基础知识,特别是当涉及到操作符的优先级和关联性时。@Someprogrammerdude非常感谢,我认为你是对的。。。看起来i==j==k被解释为(i==j)==k(首先计算第一次比较,将其结果转换为1或0,并与k进行比较)。看起来行为非常依赖于语言,所以我需要小心。。。(稍后我将添加一个自我回答。)也许像
I==j==k
这样的比较将与
(I==j==k
I==(j==k)
相同?换句话说,将一次比较的bool结果与非bool值进行比较。不同的编程语言做不同的事情。一定要阅读文档并学习语言基础知识,特别是当涉及到操作符的优先级和关联性时。@Someprogrammerdude非常感谢,我认为你是对的。。。看起来i==j==k被解释为(i==j)==k(首先计算第一次比较,将其结果转换为1或0,并与k进行比较)。看起来行为非常依赖于语言,所以我需要小心。。。(稍后我会添加一个自我回答。)非常感谢!(我尝试了更多的代码,似乎有3组语言,例如“类似C++的”组、“使其出错”组和“类似python的组”)非常感谢!(我尝试了更多的代码,似乎有3组语言,例如“类似C++的”组,“使其成为错误”组和“类似python的组”)这是一个有趣的建议,谢谢@minibean。在混合int和bool之间添加一个
==
重载,在Chapel中生成一个警告,这是很简单的。检查它是否会为我们今天所依赖的代码模式产生噪音将是一件有趣的事情(也是很琐碎的事情)。通过非常快速的检查,我们似乎可以添加这样的警告,而不会破坏我们存储库中的任何重要内容。@Brad实际上,我很惊讶我不认为这“奇怪”或“危险”在将一些代码从Python翻译到Chapel时使用i==j==k(Python代码使用double==things)。因此,我设想,类似的错误模式可能会出现在其他人身上(在未来),这可能是非常棘手的调试,因为错误是“无声的”。。。因此,如果这可以被视为一个潜在的问题来处理(在未来),我将不胜感激。完全同意。如果你想在Chapel的GitHub问题页面上打开一个问题,请求这样做(警告或重新定义a==b==c),那将是很好的,也是确保我的实验不会丢失的最好方法。这是一个有趣的建议,谢谢@minibean。在混合int和bool之间添加一个
==
重载,在Chapel中生成一个警告,这是很简单的。检查它是否会为我们今天所依赖的代码模式产生噪音将是一件有趣的事情(也是很琐碎的事情)。通过非常快速的检查,我们似乎可以添加这样的警告,而不会破坏我们存储库中的任何重要内容。@Brad实际上,我很惊讶我不认为这“奇怪”或“危险”在将一些代码从Python翻译到Chapel时使用i==j==k(Python代码使用double==things)。所以我想象着一个类似的错误
var i, j, k = 2;
writeln( i == j == k );
// => false (same as C++)
import std.stdio;
void main() {
    int i = 2, j = 2, k = 2;
    writeln( i == j == k );
}
// => Error: found == when expecting ) (and some related messages)
fn main() {
    let i = 2;
    let j = 2;
    let k = 2;
    println!( "{:?}", i == j == k );
}
// => Error
error: chained comparison operators require parentheses
 --> test.rs:6:25
  |
6 |     println!( "{:?}", i == j == k );
  |                         ^^^^^^^^^

error[E0308]: mismatched types
 --> test.rs:6:33
  |
6 |     println!( "{:?}", i == j == k );
  |                                 ^ expected bool, found integer
  |
> var i = 2
> var j = 2
> var k = 2
> i == j == k
         ^
  warning: comparing values of types Boolean and Int
           using `==` will always yield false
  res0: Boolean = false
> var i = 2
> var j = 2
> var k = 2
> i == j == k
error: operator '==' cannot be applied to 'Boolean' and 'Int'
i == j == k
var i = 2
var j = 2
var k = 2
echo( i == j == k )

=> Error: type mismatch: got <bool, int>
but expected one of: 

proc `==`(x, y: bool): bool
  first type mismatch at position: 2
  required type for y: bool
  but expression 'k' is of type: int

expression: i == j == k
> i = 2
> j = 2
> k = 2
> i == j == k
True
> i = 2
> j = 2
> k = 2
> i == j == k
true