Ordem de avaliação de operadores?

11 respostas
GALACTUS

Fala galera du rock, firmeza???

Então pessoal, nos meus primeiros exercícios de Java apareceu uma coisa que está me deixando meio maluco, é esse lance da regra de avaliação dos operadores aritméticos em Java.
No livro fala assim:

Operador * / %, Avaliado primeiro, Se houver vários operadores desse tipo, eles são avaliados da esquerda para a direita.
Operador + -, Avaliado em seguida, Se houver vários operadores desse tipo, eles são avaliados da esquerda para direita.

Exemplo:
z = p * r % q + w / x - y;
1 2 4 3 5

Bom, eu entendi que o Java faz os operadores de * / % primeiro para depois fazer os operadores de + -.

Aí vem um exercício assim:

Declare a ordem de avaliação dos operadores em cada uma das seguintes instruções Java e mostre o valor de x depois que cada instrução é realizada:

* a) x = 7 + 3 * 6 / 2 - 1;

* b) x = 2 % 2 + 2 * 2 - 2 / 2;

* c) x = (3 * 9 * (3 + (9 * 3 / (3))));

[b]

A a), eu respondi assim:

x = ((7 + (3 * 6)) / (2 - 1));  x = 25.

b) eu respondi assim:
x = ((2 % ((2 + (2 * 2)) - 2)) / 2); x = 1.

c) eu respondi assim:
x = (((3 * 9 * 3) + (9 * 3)) / 3); x = 36.
[/b]
Agora eu fiquei em duvida por que geralmente a gente faz o divisão por ultimo né(foi o que eu fiz nas respostas), só que pela regrinha que tá no livro, o divisão é feita antes da adição e subtração, no caso a a) ficaria assim:
x = ((7 + ((3 * 6) / 2)) - 1); x = 15.
3 1 2 4
a b) ficaria assim:
x = (((2 % 2) + (2 * 2)) - (2 / 2)); x = 3.
2 4 1 5 3
e a c) ficaria assim:
x = ((3 * 9 * 3) + ((9 * 3) / 3)); x = 90.
1 2 5 3 4

Então galera, isso tá me matando, eu sempre faço primeiro a multiplicação , segundo adição e subtração e por ultimo a divisão.

To meio confuso quanto a isso, qual é o correto pra éssas questões???

11 Respostas

T

O correto é primeiro os operadores multiplicativos (multiplicação, divisão e módulo) e depois os operadores aditivos (adição e subtração).

Isso vem desde os tempos do Fortran, ou seja, é coisa de 50 anos atrás. Quando seu avô ou bisavô aprendeu a programar já era assim.

Em algumas linguagens essa precedência não existe (todos os operadores têm a mesma precedência), mas você provavelmente nunca vai usá-las.

De onde você tirou que a divisão se faz por último? Não deve ser da matemática, pois na matemática isso só ocorre se você puser uma barra horizontal (é como se houvesse parênteses nos números que você põe sobre ou sob a barra horizontal), não uma barra inclinada.

GALACTUS

Bom, o senhor disse que se os operadores de divisão, multiplicação e módulo são feitos primeiro então como ficaria essa expressão algebrica m = a+b+c+d+e/5;???

Com certeza você vai dizer que fica assim m = (a+b+c+d+e)/5;
Só que aí nós estamos somando primeiro pra depois dividirmos, sendo que a regra é dividir pra depois somar, né.

Foi o que eu perguntei lá no primeiro post, nós temos que somar ou subtrair pra depois dividir né???

GALACTUS

Então como ficaria a ordem disso:

x = 3 * 3 % 9 / 2 + 5 * 3 - 9; ???

Na minha opnião teriamos que fazer (((3 * 3) % 9) / ((2 + (5 * 3)) - 9));

Neste caso ficaria primeiro (33), segundo (53), terceiro ((33)%9), quarto ((2+(53)), quinto ((2 + (5 * 3)) - 9) e sexto(por último) (((3 * 3) % 9) / ((2 + (5 * 3)) - 9));

A divisão tem precedÊncia mais alta que os outros , é isso???

Eu ainda não entendi esses lances???

T

Você entendeu tudo ao contrário.

Horizontal = “_____”, inclinada = “/”

m = a+b+c+d+e/5

Na maior parte das linguagens (VB, Delphi, Cobol, C++, C, Java), primeiramente é feita a divisão:

e / 5

e depois se calculam as adições.

Em matemática, você só deixa para fazer a divisão por último se fosse assim:

a + b + c + d + e
f = _________________
            5

onde a barra é horizontal (HORIZONTAL! EU FALEI HORIZONTAL!)

GALACTUS

A véiu, entendi, então quer dizer que no cmputador nós temos que jogar () pois se não ele fará no caso da expressão algebrica m=a+b+c+d+e/5; e/5 pra depois somar com o resto, aí temos que expessificar pra ele que é primeiro as somas pra depois dividir né, tipo (a+b+c+d+e) o resultado divide po 5.

Ei thingol, e se fosse assim ó m=a+b%c+d+e/5???

Eu teria que jogar parenteses assim: m=(((a+b)%(c+d+e))/5); ???

O módulo tem que especificar antes ou depois da divisão???

T

Como eu disse, os operadores multiplicativos têm a mesma precedência ( * , % , / ).

Não é preciso criar uma regra diferente para cada um.

Leia o que eu escrevi, e leia a especificação.

GALACTUS

A sei, no Java tipo se éssa expressão z=p*r%q+w/x-y; o Java faria primeiro a multiplicação, segunda o módulo, terceiro a divisão, quarto a adição e quinto a subtração né.

A beleza então, manjei éssas bagaças de operadores.

Valeu tíu.

B

Não tem truque em precedência de operadores, ela é a mesma que você aprendeu na classe de alfabetização. Matemática ultra-básica.

GALACTUS

Eu sei véiu, é que eu tava confundindo com uma outra coisa, mas já saquei isso.

Valeu galera.

J

cara…sei q ja tem um tempo essa pergunta ai…mas…hj e tava estudando um livro do Deitel java como programa,e tem exatamente essas perguntas q nosso colega colocou no inicio do topico…e vi q logo em seguida um parcero deu as respostas…
eu tava conferindo aki…e na terceira questão que é x = ( 3 * 9 * ( 3 + ( 9 * 3 / ( 3 ) ) ) ) o resultado aki deu diferente do resultado citado na resposta do nosso amigo…aki deu… 324

quil

Kara se você não especificar na ordem de precedência que tu queres que calcule primeiro, em java simplesmente ira calcular da esquerda para a direita, primeiro calculando os que
tem maior precedência ( *, /, % ) e depois os que tem precedência menor que eles ( +, - )

Aqui sem especificar a ordem em que eu quero que ele execute eu terei esse resultado:
x = 3 * 9 * 3 + 9 * 3 / 3
x = 90

Agora se eu especificar a ordem de precedência dessa maneira:
x = ((3 * 9) * 3) + ((9 * 3) / 3)
x = 90

Tera o mesmo resultado

Nesse exemplo que você passou aqui nos meu cálculos deu isso também.
x = ( 3 * 9 * ( 3 + ( 9 * 3 / ( 3 ) ) ) )
x = ( 27 * ( 3 + ( 9 * 3 / ( 3 ) ) ) )
x = ( 27 * ( 3 + ( 27 / 3 ) ) )
x = ( 27 * ( 3 + 9 )
x = ( 27 * 12 )
x = 324

Criado 13 de outubro de 2008
Ultima resposta 5 de jun. de 2011
Respostas 11
Participantes 5