Придет ли унарный оператор отрицания до вызова функции?

У меня нет под рукой компилятора, но это зудит мое любопытство. Если у меня есть такой код:

float a = 1;
float b = 2;

-a.add(b);

Будет ли это работать как:

add(-a, b);

или же

-add(a, b);

1

Решение

Помимо того, что float не имеет add Метод, конечно, второй — если только язык каким-то образом не знает свойств add функция. В противном случае это может быть просто неправильно: представьте, что произойдет, если вы замените -f(x) с f(-x) за f(x) = x * x!

Однако, если компилятор знает, что add это просто дополнение (например, это встраивает функция), разрешается выбирать любой способ, который он хочет, при условии, что результат остается неизменным.

Для выражения -a.add(b)определенно (-a) + b отличается от -(a + b)так что компилятор просто выберет правильный. Согласно таблица приоритетов, вызов функции имеет более высокий приоритет, поэтому -(add(a, b)) будет выбран.

3

Другие решения

Последнее, потому что знак имеет значение, когда речь идет о сложении / вычитании.

1

Предполагая, что вы определяете что-то вроде float add(float a, float b) { return a + b; }тогда будет второй. Вызовы функций имеют более высокий приоритет оператора, чем унарный минус, следовательно, он будет вызывать функцию, а затем унарный минус результат.

1
По вопросам рекламы [email protected]