У меня нет под рукой компилятора, но это зудит мое любопытство. Если у меня есть такой код:
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
это просто дополнение (например, это встраивает функция), разрешается выбирать любой способ, который он хочет, при условии, что результат остается неизменным.
Для выражения -a.add(b)
определенно (-a) + b
отличается от -(a + b)
так что компилятор просто выберет правильный. Согласно таблица приоритетов, вызов функции имеет более высокий приоритет, поэтому -(add(a, b))
будет выбран.
Последнее, потому что знак имеет значение, когда речь идет о сложении / вычитании.
Предполагая, что вы определяете что-то вроде float add(float a, float b) { return a + b; }
тогда будет второй. Вызовы функций имеют более высокий приоритет оператора, чем унарный минус, следовательно, он будет вызывать функцию, а затем унарный минус результат.