在函数调用之前,一元否定运算符会出现吗?

时间:2012-11-05 00:26:01

标签: c++ compiler-construction operators operator-precedence

我没有编译器方便,但这让我好奇。如果我有这样的代码:

float a = 1;
float b = 2;

-a.add(b);

它会以:

运行
add(-a, b);

-add(a, b);

3 个答案:

答案 0 :(得分:3)

除了float没有add方法,当然还有第二种方法 - 除非语言以某种方式知道add函数的属性。否则它可能是完全错误的:想象如果用-f(x) f(-x)取代f(x) = x * x会发生什么!

但是,如果编译器知道add只是一个加法(例如,内联函数),则允许选择它想要的任何方式,只要结果保持不变。

对于表达式-a.add(b),绝对(-a) + b-(a + b)不同,因此编译器只会选择正确的-(add(a, b))。根据{{​​3}},函数调用具有更高的优先级,因此将选择{{1}}。

答案 1 :(得分:1)

后者,因为符号在加/减时很重要。

答案 2 :(得分:1)

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