我手边没有编译器,但这激起了我的好奇心。如果我有这样的代码:
float a = 1;
float b = 2;
-a.add(b);
它会运行为:
add(-a, b);
或者
-add(a, b);
我手边没有编译器,但这激起了我的好奇心。如果我有这样的代码:
float a = 1;
float b = 2;
-a.add(b);
它会运行为:
add(-a, b);
或者
-add(a, b);
float
除了没有方法的事实之外add
,当然还有第二个——除非语言以某种方式知道add
函数的属性。否则它可能是完全错误的:想象一下如果你-f(x)
用f(-x)
for替换会发生什么f(x) = x * x
!
但是,如果编译器知道这add
只是一个加法(例如,它内联函数),那么只要结果保持不变,它就可以选择它想要的任何方式。
对于表达式-a.add(b)
,肯定(-a) + b
不同于-(a + b)
,所以编译器只会选择正确的一个。根据优先级表,函数调用具有较高的优先级,因此-(add(a, b))
会被选中。
后者,因为符号在加法/减法方面很重要。
假设您定义了类似的东西float add(float a, float b) { return a + b; }
,那么它将是第二个。函数调用具有比一元减号更高的运算符优先级,因此它将调用函数,然后一元减号结果。