X += - y * z; o que o java faz primeiro?

eu tenho uma situação:

total += - produto.getPreco() * produto.getQuantidade();

ele executa quanto eu retiro o produto do carrinho…

tem hora que funciona e tem hora que não funciona…

então eu fiz o seguinte:

total += - (produto.getPreco() * produto.getQuantidade());

o que fiz é o seguinte: total é igual a ele mesmo menos o preço do produto vezes a quantidade.

estranho que as vezes eu retiro todos os produtos do carrinho e o total fica zerado
e as vezes eu retiro tudo e sobra um valor R$ rsrs

x += - y * z;

equivale a:

x = x + (- y * z)

Em particular acho pouco claro. Eu faria:

x = x - y * z;

Ou se você prefere usar o operador “-=” (que só existe em Java por compatibilidade com o C),

x -= y * z;

Cuidado com as operações de ponto-flutuante. Por exemplo, se você fizer o seguinte:

x = 1.0 / 3.0;
y = 1.0;
y = y - x;
y = y - x;
y = y - x;

O resultado não vai ser zero e sim algo muito pequeno, próximo de zero, mas não zero.

então e o java vai fazer oq com isso x = x - y * z;?

x-y primeiro
ou y*x?

ou eh aleatório?

[quote=alandiniz]então e o java vai fazer oq com isso x = x - y * z;?

x-y primeiro
ou y*x?

ou eh aleatório?[/quote] Aí se aplica a regra de matemática, primeiro multiplicações e divisões, depois somas e subtrações.

As linguanges em que a precedência das operações aritméticas não se aplica são:

LISP - as operações são todas usando parênteses :slight_smile:
FORTH - a notação é a notação polonesa inversa :slight_smile:

A sintaxe da APL é tão esquisita que, apesar de ter escrito programas em APL faz quase 30 anos atrás, não me lembro mais se ela obedece ou não aos critérios de precedência - http://en.wikipedia.org/wiki/APL_syntax_and_symbols

Em todas as outras linguagens que eu me lembre, a “multiplicação é mais forte que a adição”, ou seja, ela é executada primeiro.

No caso específico de Java, vale a pena ver a tabela de precedência de operadores:
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

se você fizer assim x -= y * z;
ele ira fazer primeiro o x-y depois *z
e se você fizer assim x = x - y *z;
ele seguirá as regras da matemática

[quote=Kevin_Stortz]se você fizer assim x -= y * z;
ele ira fazer primeiro o x-y depois *z
e se você fizer assim x = x - y *z;
ele seguirá as regras da matemática[/quote]

Não. Se vc fizer:

x -= y * z;

Ele inicia pelo que está depois do igual. E só depois faz o assignment. Ou seja, ele fará:

resultado = y * z. x = x - resultado.

Os operadores de atribuição (+=, -=, *=, >>=, |=, etc.) tem a menor precedência possível. Sempre será executado por último. O que também é válido aqui:

x *= a+b;

Nesse caso, não é equivalente a:

x = x * a + b;

E sim:

x = x * (a+b);