gpt4 book ai didi

rust - -1 和 pow 的特殊行为

转载 作者:行者123 更新时间:2023-12-05 09:01:11 26 4
gpt4 key购买 nike

我正在调试一些代码来计算矩阵的行列式,当我找到原因时非常失望。简单地说,这段代码:

-1i64.pow(i as u32)

总是产生 -1。我发现我可以使用 i64::pow 代替,或者将 -1i64 括在括号中来解决问题:

i64::pow(-1, i as u32)
(-1i64).pow(-1, i as u32)

我很失望,也很伤心,因为 rustc 告诉我使用第一个例子:

  |
3 | println!("{}", -1.pow(i as u32));
| ^^^
|
help: you must specify a concrete type for this numeric value, like `i32`
|
3 | println!("{}", -1_i32.pow(i as u32));
| ~~~~~

我试过带下划线和不带下划线,它们仍然总是导致 -1。我的问题是,为什么会这样?括号在这里有什么作用? -1i64.pow(i as u32) 实际上是做什么的?我在文档、Rust 书籍或 Stack Overflow 中找不到任何内容。

Here's a playground

最佳答案

您的代码解析为 -(1.pow(...))1.pow(...)1。否定 1 产生 -1。括号会像往常一样改变优先级,所以 pow 被发送到 -1,而不是 1

I'm disappointed and sad-mad because rustc told me to use the first example:

Rust 不知道您是要否定 1 还是 1.pow(...),所以您的失望被取代了 :P


关于 JavaScript 的附录:

I come from JavaScript and we can't do 2.someMethod()

当然你可以调用数字方法;但是如果你在 1 上这样做,JavaScript 会报错,因为它总是期望第一个点是小数点,所以如果直接在数字文字上调用方法,你必须让它们 float (即 1.toString() 不好,1.0.toString() 好,(1).toString()1.. toString()).

现在,Number 没有方法 pow,但我们可以创建它(仅用于演示目的,因为不推荐更改内置原型(prototype)):

Number.prototype.pow = function(p) { return Math.pow(this, p) }

现在你遇到了与 Rust 相同的情况:

-1.0.pow(2)
# => -1
(-1.0).pow(2)
# => 1

关于rust - -1 和 pow 的特殊行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73930915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com