为什么负数在平方时常需使用括号才能得到预期结果?
有人知道为什么在很多编程语言中,负数在平方时需要加括号,而在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 个回答
假设你在数学作业上写了 。这意味着
,而不是
。在 R、Python 和 Ruby 中也是一样。当你写
-5**2
时,这表示 -(5**2)
,而不是 (-5)**2
。这里的指数运算符优先级比负号高。
另一方面,当你这样做
product = number * number;
并且使用一个负数时,这个操作是将负数自己乘以自己。负号是在平方之前就处理了,而不是之后。如果你在其他语言中做同样的事情,你也会得到相同的结果。
在前面的例子中(Python, Ruby, R),指数运算符的优先级更高。我们可以从这些链接中看到,Python 的优先级规则在 Python 运算符优先级,Ruby 的在 Ruby 运算符优先级,而 R 的在 运算符语法和优先级。所以,指数运算会在一元负号之前进行计算。
值得注意的是,正如 Vincent Zoonekynd 指出的那样,Excel 在这种情况下实际上是按照 OP 预期的方式来处理的,因此根据你的背景,问题可能并没有很多评论所说的那么明显。
这里的误解似乎在于你认为 -
是数字的一部分,但实际上不是。-
实际上是一个运算符,它是作用于数字的,就像指数运算一样。
在 C 语言中,你输入的是一个负数,因此没有运算符优先级的问题。这里有 C 语言的 运算符优先级表 供参考。
所以你在比较两种不同的情况,如果你在 Python 中做类似的操作,你会看到类似的结果:
>>> x = -5
>>> x**2
25