为什么负数在平方时常需使用括号才能得到预期结果?

-3 投票
2 回答
783 浏览
提问于 2025-04-17 21:31

有人知道为什么在很多编程语言中,负数在平方时需要加括号,而在C语言中却不需要吗?

这里有一个在R语言中的例子:

> -5^2
[1] -25
> # now let's use parentheses
> (-5)^2
[1] 25  

在Python中也是一样的情况:

>>> -5**2
-25
>>> (-5)**2
25

为了好玩,我们也在Ruby中试试(使用了http://repl.it/作为解释器):

 > 5**2
=> 25
 > -5**2
=> -25
 > (-5)**2
=> 25

但是,如果我们在C语言中实现这个简单的程序,负数在平方时就不需要加括号也能正确计算:

#include <stdio.h>

int main(void){
  int number, product;
  printf("\nEnter the number you want squared: ");
  scanf("%d", &number);
  product = number * number;
  printf("Squared number: %d \n", product);
  return 0;
}

这是C程序的输出结果:

Enter the number you want squared: 5
Squared number: 25 

接下来,我会使用一个负数:

Enter the number you want squared: -5
Squared number: 25 

如果有人知道这个背后的原因,我很想了解一下。

2 个回答

3

假设你在数学作业上写了 enter image description here。这意味着 enter image description here,而不是 enter image description here。在 R、Python 和 Ruby 中也是一样。当你写 -5**2 时,这表示 -(5**2),而不是 (-5)**2。这里的指数运算符优先级比负号高。

另一方面,当你这样做

product = number * number;

并且使用一个负数时,这个操作是将负数自己乘以自己。负号是在平方之前就处理了,而不是之后。如果你在其他语言中做同样的事情,你也会得到相同的结果。

6

在前面的例子中(Python, Ruby, R),指数运算符的优先级更高。我们可以从这些链接中看到,Python 的优先级规则在 Python 运算符优先级,Ruby 的在 Ruby 运算符优先级,而 R 的在 运算符语法和优先级。所以,指数运算会在一元负号之前进行计算。

值得注意的是,正如 Vincent Zoonekynd 指出的那样,Excel 在这种情况下实际上是按照 OP 预期的方式来处理的,因此根据你的背景,问题可能并没有很多评论所说的那么明显。

这里的误解似乎在于你认为 - 是数字的一部分,但实际上不是。- 实际上是一个运算符,它是作用于数字的,就像指数运算一样。

C 语言中,你输入的是一个负数,因此没有运算符优先级的问题。这里有 C 语言的 运算符优先级表 供参考。

所以你在比较两种不同的情况,如果你在 Python 中做类似的操作,你会看到类似的结果:

>>> x = -5
>>> x**2
25

撰写回答