Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Operadores
6.1. Atribuio
A primeira categoria de operadores tambm a mais utilizada. Em e, o
operador de atribuiao "=" utilizado para atribuir um determinado valor a
tima varivel. Um exemplo de atribuio:
X = 10;
y = x;
Podemos verificar no programa anterior duas operaes de atribuio: na
primeira, foi atribudo o valor 10 varivel "x", na segunda, foi atribudo o va-
tor de "x" (que 10) varivel "y". Conclui-se ento que ao final do programa,
y" ser igual a 10.
Repare que a atribuio sempre avaliada da direita para a esquerda e
no possvel realizar uma atribuio no sentido inverso.
6.2. Aritmticos
So uti lizados para determinar ao compilador que efetue determin
operao matemtica em relao a um ou mais dados:
Operador Ao
+ Adio
- Subtrao ou menos unrio
* Multiplicao
/ Diviso
% Resto de diviso inteira
++ Incremento
-- Decremento .
Tabela 6.1
i nt x,y, z;
X = O;
y = X ++;
Z = ++ X;
Neste caso, aps a execuo dos trs comandos, o valor da varivel "x"
ser igual a 2 , o valor da varivel "y" ser igual a O e o valor da varivel "z"
ser Igual a 2.
Note que h uma diferena clara entre escrever "y = x + 1 " e "y = ++x":
Ambas produziro o mesmo resultado em "y", no entanto, no primeiro
caso, somente a varivel "y", alvo da atribuio, alterada. J no segundo
caso, tanto "y", como "x" so alteradas !
6.3. Relaclonals
So utilizados em testes condicionais para determinar a relao existente
entre os dados:
Operador Ao
> Maior que
>= Maior ou igual a
< Menor que
<= Menor ou igual a
-- Igual a
=
Diferente de
Tabela 6.2
Operador Ao
&&: AND (E)
11 OR (OU)
.
1
NOT (NAO)-
Tabela 6.3
int x,y;
X= 10;
if (x>S &:& x<20) y = x;
Como podemos verificar, a varivel "y" somente ser igual ao valor da
rivel "x" se o valor de "x" for maior que 5 .e "x" for menor que 20. O que
leva a concluir que ao final da execuo do programa "y" ser igual a 10.
Observe que para determinar o resultado da conjuno no comando
compilador procede da seguinte forma: primeiramente avalia a expresso
5 ", o que no presente caso resulta verdadeiro, j que "x", que vale 10
maior que 5. Em seguida, procede avaliao da expresso "x < 20", a
tambm resulta verdadeira. Finalmente, o compilador verifica o resultadc
conjuno (verdadeiro E verdadeiro) o qual verdadeiro, executando ass
atribuio seguinte (y = x).
Um aspecto importante a ser observado que em C, uma varivel corr
for igual a zero, ser avaliada como falsa e se tiver um valor diferente de z
ser avaliada como verdadeira. Vejamos um outro exemplo:
int teste,teste_2;
teste = O;
teste_2 = O;
if (!teste) teste_2++;
Operador Ao
& ANO (E)
1 OR (OU)
" XOR (OU exclusivo)
- NOT (complemento de um)
>> Deslocamento direita
<< Deslocamento esquerda
Tabela 6.4
i n t vl,v2 ;
vl = 100 ;
v2 = vl & 15 ;
100 decimal = O 1 1 OO 1 OO
ANO(&)
015 decimal = O O O O 1 111
Resultado = OOOOO 1 OO
Isto sign ifica que o valor armazenado em "v2" ser igual a 4 decimal.
Podemos perceber que o operador lgico ANO uma excelente forma
desligar um ou mais bits de uma determinada varivel, J que um bit O em u
dos operandos far com que o respectivo bit do resultado seja tambm igua
zero. Imagine que desejemos desligar os bit s 5, 6 e 7 de uma varivel cham
da "portb". A forma de fazer isso poderia ser:
lbyte portb = 6
portb = portb & OblllOOOOO;
!.nt vl,v2;
vl .. Ox20;
v2 =
vl 1 Ox 04;
. ~~~~~~~~-M_1c_roc_o_nt_ro_~_do_~_s_Pr_c_-P_rog~ra_m_a~_-o_e_m_C~~~~~~~--..
'
Vejamos a execuo da operao XOR:
100 decimal = O 11 O O 1 O O
XOR { ")
99 decimal = O 11 O O O 11
Resultado = O O O O O 11 1
int x,y;
long a,b;
X = 1;
a = l;
y = - X;
b = - a;
10 decimal = o oo o1 o 1 o
<<
00010100
<<
Resu ltado :;;;:; OO1 O1 OOO
10 decimal = OO O O1 O 1 O
>>
z= 00000 1 01
Percebemos que o contedo da varivel "x" (00001010 binrio ou 10 de-
cimal) deslocado um bit direita, resultando em 00000101 binrio ou 5
decimal, sendo este valor atribudo varivel "z".
Com base nestas operaes podemos verificar que no operador de deslo-
camento esquerda, cada bit deslocado eqivale a multiplicar o primeiro ope-
rando por 2. J no operador de deslocamento direita, eqivale a dividir o
operando por 2.
Observe que cada operao de rotao traduzida pelo compilador em
uma instruo assembly de rotao de bits (R LF ou RRF, conforme o caso).
~~~~~~~~~~M_ic_roc_o_n_tro_la_d_or_es_P_IC~P_ro_g_ra_m_aa_-_o_em~C~~~~~~~--...,
6.6. Memria
Os operadores de memria, tambm chamados de operadores de pontei-
ros, so elementos de grande importncia na linguagem C. De fato, os pontei-
ros so considerados um dos pilares da linguagem C, pois permitem o acesso
direto a qualquer endereo de memria do sistema. Existem dois operadores
complementares para o acesso memria:
Operador Ao
& Endereo do operando
* Contedo do endereo apontado pelo operando
Tabela 6.5
endereco_a ~ &a;
6.6.2. Operador *
J o * um operador unrio utilizado para retomar o contedo da posio
de memria endereada pelo operando que o segue. Vejamos outro exemplo:
a = *endereco_a;
O que far com que o valor armazenado no local apontado pela varivel
endereco_a" seja atribudo varivel "a".
Veja em seguida um pequeno exemplo da utilizao de ponteiros:
Exemplo 6.1
tnclude <1 6f628.h>
iuse d elay(clock=4000000)
tfuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
tuse rs232(baud=l9200,parity=N,xmit=PIN_B2.rcv=PIN_Bl)
int *endereco , x,y;
main ( 1
(
X = 5;
enderece = &x;
y = *endereco;
printf("valor x= %d - endereco de x= %lx valor y= td',x,endereco,y);
}
6. 7. Outros Operadores
Alm dos operadores anteriormente citados, podemos encontrar ainda o
tros operadores no to conhecidos em C:
Operador Ao
?
Operador ternrio condicional
Separador de estruturas
-> Ponteiro de elemento de estrutura
(tipo) Operador de Modelagem de dado
sizeof Retorna o tamanho da varivel
Tabela 6.6
6. 7 .1. Operador?
O operador ternrio "?" utilizado para substituir uma expresso condi
cional baseada no comando IF e tem esse nome devido ao fato de ser com-
posto sempre por trs expresses. Sua forma geral :
1
Exemplo 6.2
tbyte porta = 5
lbyt:e portb = 6
int liga,_led(v o i d)
{
por ta = porta 1 l; // ativa o pino O da porta A
}
int d esl iga_led (voi d)
{
porta =por ta & 254; //des liga o pino O d a porta A
}
main (}
{
whil e (truel (portb & ll ? l iga_led(l : des liga_led() ;
)
y = (x=O , x +S) ;
Z = (X = 0, Y = 5, X - 2);
( t ipo) varivel
Onde "tipo" especifica o novo tipo de dado para o qual o contedo atual
da varivel especificada ser convertido .
' ~~~~~~~~~M_lcroc
~o_nt_rol_ad_o_re_s_Pl_C_-P_rog_;_ra_ma_~~-m~C~~~~~~~~
'
Observe que o contedo da varivel no alterado pelo operador, ao in-
s disso, aloca-se uma regio de RAM para o armazenamento temporrio do
.'alor modificado.
sizeof varivel OU
sizeof (tipo de dado)
x+=y x=x+y
X-= y x=x-y
X*= y x=x*y
Tabela 6.7 (Continua)
Forma reduzida Forma expandida
X/= y x=x / y
X%= y x=x%y
X&= y x=x&y
X I= y X= X 1Y
X" = y X = X 11 y
X<<= y X= X<< y
X >>= y X= X>> y
Tabela 6.7
Ordem Operador
Maior ( ) [ l ->
-
(tipo) ..
! --sizeof
++
&
/
*
+ -
'
<< >>
--
-- !=
6c
1
&&
11
.
?
- += -= *= /=
Menor '
Tabela 6.8
6.10. Exerccios
int x ,y;
y = 256;
y += l;
X = y >> l;
long int x;
int y,z;
x = Ox l234;
Y =Xi
z = x>>S;
. ~~~~~~~~~~M_ic_roc_o_n_trol_a_d_o_res~P_JC_-_P_rog~ra_m_aa_-_o_e_m_C~~~~~~~~~
'