Expressões lógicas e o executável do EP4

Expressões lógicas e o executável do EP4

por José Coelho de Pina -
Número de respostas: 2

Salve,

Como mencionei na aula de hoje, o executável do EP4 faz mais do que promete.
Ele aceita algumas expressões lógicas simplificadas que utilizam os operadores relacionais os operadores relacionais '<' e '>' e os operadores lógicos (simplificados) '&' e '|':

operaçãosímbolo
adição +
subtração -
multiplicação *
divisão /
exponenciação ^
troca de sinal !
atribuição =
maior >
menor <
E lógico &
OU lógico |

A tabela de precedência estendida é

 ()esquerda-para-direita
operador unário ! direita-para-esquerda
 ^   direita-para-esquerda
 *  / esquerda-para-direita
 +  - esquerda-para-direita
 >  < esquerda-para-direita
  &   esquerda-para-direita
  |   esquerda-para-direita
   =         direita-para-esquerda

O resultado de um operador relacional ou lógico é 1 se o resultado for verdadeiro e zero em caso contrário. Testem o executável com os dados abaixo e vejam os resultado.

B = 2 > 2
A = 1
B = 2
C = A > B 
C = A > B | 1
D = A < B
D = A < B & 1
E = C & D
F = C | D
D = ((A = (B = 1) + 2) > 2*(C = 2))
A = ( (B = 1) > (C = 2) & 1)

Essa brincadeira talvez ajude a entender expressões que usamos frequentemente como

  return ini == fim;

  if ( (x = stackPop()) == ')') ...

  if ( (arq = fopen(...)) == NULL) ...

Em C, diferente de zero é sinônimo de verdadeiro

   while (1) { /* loop infinito */
     ...
   }

   if (A) { /* equivalente a "if (A != 0)" */
     ...
   }
Em resposta à José Coelho de Pina

Re: Expressões lógicas e o executável do EP4

por Gustavo Caparica -

Professor, parece que o executável solução do EP4 dá resposta trocada para ">" e "<".

No seu exemplo, na quarta linha "C = A > B", com A = 1 e B = 2, como 1 não é maior do que 2, C deveria ser 0. Porém o executável dá a resposta C = 1.

As outras operações ("&" e "|") parecem dar o resultado certo.

É um erro do executável mesmo, ou eu estou entendendo algo errado?

Em resposta à Gustavo Caparica

Re: Expressões lógicas e o executável do EP4

por José Coelho de Pina -

Oi Gustavo,

Ops, você tem razão olho roxo.
No executável o '>' e o  '<'  estão trocados.
Corrigi isto e coloquei um novo executável  aqui.

A propósito, um erro bem comum em intridução à computação é o aluno escrever

if (A < B < C) { ... } 

pensando que isto é o mesmo que

if (A < B && B < C) { ... }

Inclusive o gcc apresenta o seguinte warning nesse caso:

 warning: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning 

Agora que vocês estão fazendo um interpretador de expressões aritméticas (que são semelhantes a expressões lógicas),
qual vocês acham que é o significado de

A < B < C 

Utilizem o executável do ep4 com um arquivo contendo as expressões abaixo e vejam o resultado

A = !2
B = !1
C = 0
D = A < B < C