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