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 
FORTH - a notação é a notação polonesa inversa 
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);