Dúvida tratamento de expressão

Dúvida tratamento de expressão

por Edgar Bernardi Righi -
Número de respostas: 5

Na entrada existe a expressão : C = D = A = B + A / 3.2 / A.

Sendo A = 2 e B = 5.1.

Penso que o cálculo seria: C = D = A = B + (A/(3.2/A)) . Isso dá 5.1 + (2/(3.2/2)) = 5.1+1.25 = 6.35

Pois a precedência é da direita para a esquerda para operadores iguais. O meu executável sempre usa essa regra e produz o resultado acima. Ele acerta 2 ^ 2 ^ 3 (calcula 2^(2^3) ) e a=b=c=5, por exemplo.

No entanto no executável do EP ele retorna 5.4125 ou seja, ele calcula 5.1 + (2/3.2)/2. Isso está correto? Então tenho que mudar as regras para tratar divisão e usar direita para esquerda para todo o resto?

Em resposta à Edgar Bernardi Righi

Re: Dúvida tratamento de expressão

por Vinícius Bitencourt Matos -
"Pois a precedência é da direita para a esquerda para operadores iguais."

Depende do operador... 1/2/3 é 1/6, não 3/2, assim como 5 - 2 - 3 é 0 e não 6.

http://www.ime.usp.br/~pf/algoritmos/apend/precedence.html

Em resposta à Vinícius Bitencourt Matos

Re: Dúvida tratamento de expressão

por Edgar Bernardi Righi -
Valeu pela tabela! Mas nessa tabela a precedência de ^ e / estão iguais, ambas da esquerda pra direita. Mas ^ deveria ser da direita pra esquerda. Melhor usar a tabela do enunciado da ep, não tinha lido até o final.
Em resposta à Edgar Bernardi Righi

Re: Dúvida tratamento de expressão

por José Coelho de Pina -

Ois Edgar e Vinícius,

nessa tabela a precedência de ^ e / estão iguais, ambas da esquerda pra direita. Mas ^ deveria ser da direita pra esquerda.

No EP4 "^" é usado artificialmente  para denotar exponenciação a^b significa ab.
Em matemática e naturalmente nas linguagens de programação que possuem um operador nativo para exponenciação, a associatividade da exponeciação é da direita para a esquerda, ou seja, a^b^c significa abc.
A linguagem C não possui operador exponenciação nativo.
Em C o símbolo "^" é o operador binário bitwise XOR que tem associatividade da esquerda para a direita.

No enunciado temos uma tabela com o significado de cada operador e outra com a sua precedência e regra de associatividade.
Com excessão feita aos operadores _ (menos unário) e ^ exponenciação os demais operadores existem em C.
Hmmm, se bem que a semântica de / e % não é exatamente a do C:

5 / 2   ==  2.5 
6 % 2.2 ==  1.6
Em resposta à José Coelho de Pina

Re: Dúvida tratamento de expressão

por Thiago Pereira Bueno -

Aproveitando a discussão...

Na página do enunciado, na última linha da tabela de exemplos de precedência de operadores, não entendi pq a expressão " A * _ B ^ C - 2" deve ser interpretada como "((A * ((_ B) ^ C)) - 2)" uma vez que está escrito logo acima que "a associatividade é da direita para a esquerda dos operadores !, '_', '^'"

Não deveria ser algo do tipo: (( A * (_ (B ^ C))) - 2) ?

Testando com o pitao-linux32 obtive a seguinte expressao posfixa "A B C ^ _ * 2 -"...