3

有人可以解释为什么我在第一种情况下得到积极的结果,而在第二种情况下得到否定的结果。

auto r1 = -3.0L;
auto r2 = 2.0L;
writeln(typeid(r1)); // real 
writeln(typeid(r2)); // real 
writeln(typeid(r1 ^^ r2)); // real
writeln(r1 ^^ r2); // 9

writeln(typeid(-3.0L)); // real
writeln(typeid(2.0L)); // real
writeln(typeid(-3.0L ^^ 2.0L)); // real
writeln(-3.0L ^^ 2.0L);  // -9
4

2 回答 2

5

免责声明:我不知道 D。这是在我的背景下使用其他语言编写的。

当您平方一个负(实)数时,该数变为正数。您正在编写模棱两可的(对人类而言)表达式:

-3^2

这可能意味着:

  • -(3^2) = -9或者
  • (-3)^2 = 9

从输出来看,我假设编程语言的运算符优先级是第一个。尝试将最后一行替换为:

writeln((-3.0L) ^^ 2.0L);  // -9
于 2012-05-21T05:43:07.950 回答
2

上面的来源没有错。更好的是,旧的 FORTRAN 具有最高优先级的电源运算符(参见http://h21007.www2.hp.com/portal/download/files/unprot/fortran/docs/lrm/lrm0067.htm示例)。因此,在几乎所有具有幂运算符的现代编程语言中,表达式-3^2将被计算为-(3^2).

即使在数学表达式中,此规则也是相同的:http ://en.wikipedia.org/wiki/Order_of_operations#Exceptions_to_the_standard

于 2012-05-21T17:46:40.137 回答