1

我手边没有编译器,但这激起了我的好奇心。如果我有这样的代码:

float a = 1;
float b = 2;

-a.add(b);

它会运行为:

add(-a, b);

或者

-add(a, b);
4

3 回答 3

3

float除了没有方法的事实之外add,当然还有第二个——除非语言以某种方式知道add函数的属性。否则它可能是完全错误的:想象一下如果你-f(x)f(-x)for替换会发生什么f(x) = x * x

但是,如果编译器知道这add只是一个加法(例如,它内函数),那么只要结果保持不变,它就可以选择它想要的任何方式。

对于表达式-a.add(b),肯定(-a) + b不同于-(a + b),所以编译器只会选择正确的一个。根据优先级表,函数调用具有较高的优先级,因此-(add(a, b))会被选中。

于 2012-11-05T00:27:09.517 回答
1

后者,因为符号在加法/减法方面很重要。

于 2012-11-05T00:29:22.547 回答
1

假设您定义了类似的东西float add(float a, float b) { return a + b; },那么它将是第二个。函数调用具有比一元减号更高的运算符优先级,因此它将调用函数,然后一元减号结果。

于 2012-11-05T00:31:34.110 回答