Sei sulla pagina 1di 16

6

Operadores

Como j foi dito, a linguagem C possui uma gama de operadores, sendo


possivelmente uma das linguagens com maior nmero de operadores dispon-
vel atualmente.
Esta caracterstica um dos pontos positivos da linguagem, j que C
agrega aos operadores comumente encontrados nas linguagens de alto nvel,
os operadores encontrados freqentemente em linguagens de baixo nvel
como o Assembly.
Podemos classificar os operadores da linguagem e em sete categorias
principais: atribu io, aritmticos, relacionais, lgicos, lgicos bit a bit, de
memria e outros.

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

Os operadores de adio, subtrao, multiplicao e d iviso dispen


comentrios.

O operador % utilizado para retornar o resto de uma operao de divi


inteira. Vejamos um exemplo:

5 / 2 = 2 ,5 em uma diviso real, ou 5 / 2 = 2, em uma diviso intei


sendo o resto igual a 1.
Assim, o resultado de 5 / 2 2 e o resultado de 5 % 2 igual a 1.~
Os operadores de incremento e decremento so utilizados para somar
(incremento) ou subtrair 1 (decremento) de uma varivel.

A forma geral para utilizao destes dois ltimos operadores :


varivel ++; ou varivel --;

Ou ainda por meio de uma atribuio:

variavel_l = variavel_2 ++; ou variavel_l = variavel_2 -- ;

Observe que em ambos os casos, a atribuio ocorre da seguinte fo


o valor da varivel vari avel _2 armazenado em variavel_l" e aps is
o contedo de "variavel_2" incrementado ou decrementado.

No entanto, em C tambm possvel escrever:

variavel_l = ++ variavel_2; ou variavel_l = -- variavel_2 ;

Microcontroladores PIC Programao em C


Nestes casos, a operao de incremento/decremento realizada antes
da atribuio propriamente dita.
Vejamos um exemplo:

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.

Observao Importante: No possvel utilizar os operadores de incre-


mento ou decremento com variveis ou tipos de dados complexos, tais
como os tipos pont o flutuante.

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

No h muito o que falar sobre estes operadores, j que o seu funciona-


mento idntico ao que todos estudamos na disciplina de matemtica e que
utilizamos no nosso dia-a-dia.
Repare que os operadores relacionais podem ser utilizados para constn
expresses condicionais como j visto no captulo anterior.

6.4. Lgicos Booleanos


Os operadores lgicos ou booleanos so utilizados para realizar conJ
es, disjunes ou negaes entre elementos em um teste condicional.
operadores lgicos somente podem resultar em um dos valores: verdadeiro
falso.

Operador Ao
&&: AND (E)
11 OR (OU)
.
1
NOT (NAO)-
Tabela 6.3

Os operadores relacionais so elementos de suma importncia na c


truo de testes condicionais. Com esses operadores podemos relacio
diversas condies diferentes em um mesmo teste lgico.
Vejamos um exemplo:

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++;

Microcontroladores PIC Programao em C


Como podemos perceber, a avaliao de "!teste" ser verdade ira, j que
a varivel possui valor zero e o teste verifica a negao da varivel. Assim, no
presente caso, a varivel "teste_2" terminar com o valor 1.

Observao Importante: No possvel utilzar os operadores lgicos com


variveis ou tipos de dados complexos, tais como os tipos ponto flutuante.

6.5. Lgicos Bit a Bit


Os operadores lgicos bit a bit so utilizados para realizar operaes lgi-
cas entre elementos ou variveis. No entanto, ao contrrio dos operadores
lgicos simples, os operadores lgicos bit a bit podem resultar em um valor da
mesma magnitude dos elementos operados .

Operador Ao
& ANO (E)
1 OR (OU)
" XOR (OU exclusivo)
- NOT (complemento de um)
>> Deslocamento direita
<< Deslocamento esquerda
Tabela 6.4

6.5.1. Operador 8c {And)


A operao lgica ANO funciona da mesma forma que o operador boolea-
no AND, mas com a diferena de que a operao realizada separadamente
para cada bit dos operandos . Vejamos um exemplo:

i n t vl,v2 ;
vl = 100 ;
v2 = vl & 15 ;

A operao ANO representada ocorrer da seguinte forma:

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;

6.5.2. Operador 1 {OR)


A operao OR, tal qual o operador ANO, tambm trabalha de maneira
mlar ao seu equivalente booleano, com a diferena de que tambm aqui
operao realizada para cada bit dos operandos. Vejamos um exemplo:

!.nt vl,v2;
vl .. Ox20;
v2 =
vl 1 Ox 04;

Esta operao OR ser realizada da seguinte forma:

20 hexadecimal = OO1 OOOOO


OR (1)
04 hexadecimal ::::: OOO OO 1 OO
Resultado = OO1 OO1 OO

Como podemos perceber, o resultado armazenado em "v2" ser igual a


24 hexadecimal, e se analisarmos a operao, poderemos concluir que a ope-
rao OR constitui uma excelente forma de ligar bits de uma varivel, j que os
bits em um dos operandos permanecero sempre ativados no resultado.

6.5.3. Operador " {XOR)


A XOR (exclusivamente OU) consiste em uma operao lgica entre dois.
na qual o resultado somente ser verdadeiro (nvel lgico 1 ) se um e somente
um deles for verdadeiro (nvel 1). Ou seja, caso os operandos sejam iguais (O.
O ou 1, 1), o resultado ser falso (nfvel O).

Operadores XOR so multo utilizados em funes de comparao de valer


res: se os bits dos operandos so iguais, o resultado O; se forem diferentes.
o resultado 1. Vejamos um exemplo do funcionamento do operador XOR em
C:
int x,y;
X = 100;
y " X ~ 99;

. ~~~~~~~~-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

Podemos observar que apenas os bits diferentes entre os dois operandos


resultaram em um valor 1. Os bits iguais resultaram em um valor O. Se os
operandos fossem iguais, o resultado seria igual a zero.

6.5.4. Operador - (NOT)


O NOT atua como operador de negao, ou em aritmtica binria o com-
:J emento de um. Isto significa que o operador NOT inverte o estado de cada
01t do operando especificado. Vejamos um exemplo:

int x,y;
long a,b;
X = 1;
a = l;
y = - X;
b = - a;

Vejamos a operao do operador de complemento:

1 decimal = O O O O O O O 1 ( 8 bits, varivel x)


Resultado= 1111111 o ( 8 bits, varivel y)

1 decimal = O O O O O O O O O O O O O O O 1 ( 16 bits, varivel a)


Resultado = 1 11111111111111 O ( 16 bits, varivel b)
Conclumos ento que a varivel "x", de 8 bits, terminar o programa com
:l complemento do valor 1, ou seja, 254.

J varivel "b" ser atribudo o valor da negao de "a", de 16 bits, o


_ae resulta no valor 65534.

6.5.5. Operadores de Deslocamento << E >>


Finalmente, temos ainda os operadores de deslocamento de bits es-
:;.;erda e direita. O formato geral de uso destes operadores :

valor >> nmero de bits a deslocar direita ou


valor << nmero de bits a deslocar esquerda
Vejamos um pequeno programa para demonstrar o funconamento dos
operadores de deslocamento:
in t x, y, z ;
X = 10 ;
y = X << 2 ;
Z = X >> l ;-

o funcionamento dos operadores de deslocamento o seguinte:


Primeiramente atribudo varivel "y" o deslocamento de dois bits
esq uerda da varivel "x". Vejamos o funcionamento desta operao:

10 decimal = o oo o1 o 1 o
<<
00010100
<<
Resu ltado :;;;:; OO1 O1 OOO

Observe que foram realizadas duas operaes de deslocamento, sendo


que o primeiro deslocamento resultou em 00010100 binrio (20 decimal). Em
seguida real izado outro deslocamento, que resulta em 00101000 binrio
(40 decimal), sendo este valor atribudo varivel "y" .
A prxima linha atribui varivel "z" o valor de "x" deslocado um bit di-
reita. Vejamos o seu funcionamento:

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).

Observao Importante: No possvel utilizar os operadores lgicos bit a


bit com variveis ou tipos de dados complexos , tais como os tipos ponto
flutuante.

~~~~~~~~~~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

6.6.1. Operador &


O & um operador unrio utilizado para retornar o endereo de memria
do seu operando. Isto significa que se escrevermos:

endereco_a ~ &a;

Teremos que a varivel "endereco_a" conter o endereo em que est


armazenada a varivel "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);
}

Provavelmente a sada impressa deste programa ser:

valor x= 5 - enderece de x= 26 - valor y= 5

O que significa que o valor de "&x" (endereo de "x") igual a Ox26,


seja, a varivel "x" est localizada no endereo Ox26 da memria RAM do PIC.

Maiores detalhes sobre o funcionamento dos operadores de memria set


ro vistos quando estudarmos a operao dos ponteiros no captulo 8.

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 expresses

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 :

varivel = Expressaol? Expressao2: Expressao3

O que significa: avalie a expresso 1 e se ela for verdadeira, atribua va-


rivel a expresso 2; caso contrrio, atribua a expresso 3. Vejamos um
exemplo:

Microcontroladores PIC Programao em C


i n t x ,y;
X = 5;
y = x==7 ? 10: x+3;

O funcionamento deste programa o segu inte: primeiramente atribudo


o valor 5 varivel "x". Em seguida , a expresso condicional avaliada: se
"x" for igual a 7, ento "y" ser igual a 10; caso contrrio, "y" ser igual a "x"
mais 3. Como sabemos que "x" igual a 5 , teremos que "y" ser igu al a 8
(5+3).
Note que tambm possvel utilizar o operador "?" de uma forrn pouco
convencional, como neste outro exemplo:

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() ;
)

Neste peq ueno programa, temos t rs funes: a principal main() e outras


duas chamadas llga_led e desllga_led.

Na f uno principal, o programa permanecer num loop infinito (whlle


(true}) avaliando a expresso:

(portb & 1) ? liga_led( J : desliga_led();

Se a avaliao de "portb & 1" resultar verdadeira, ou sej a, diferente de


zero, ou melhor dizendo: se o bit O da porta B estiver em nvel lgico 1, ser
executada a primeira funo llga_led; caso contrrio, ser executada a segun-
da funo desllga_led.

6. 7.2. Operador Vrgula


Outro operador pouco conhecido da linguagem C o vrgula, ut ilizado para
enfileirar duas ou mais expresses. A forma geraI de utilizao deste operador
:
varivel = (expresso 1, express o 2[,express!o x i)

Note que as expresses so avaliadas da esquerda para a direita e a


rivel recebe o valor da ltima expresso avaliada.
Veja o exemplo seguinte:

y = (x=O , x +S) ;

Como podemos perceber, primeiramente a varivel "x" assume o vai


zero e em seguida, "y" ir assumir o valor de "x" mais 5 , ou seja, ao final d
avaliao da expresso, " y = 5 " .
Observe ainda que possvel colocar outras expresses no necessari
mente relacionadas com a atribuio em si, como no exemplo seguinte:

Z = (X = 0, Y = 5, X - 2);

O compilador gera cdigo para cada expresso individualmente, terminan-


do por gerar o ltimo cdigo: "z = x - 2".

6. 7.3. Operador Ponto


O operador pont o utilizado em estruturas de dados como separador dos
elementos e ser estudado mais adiante, no captulo 8.

6. 7 .4. Operador ->


Tambm chamado de operador seta , utilizado para a funo de ponteiro
para uma estrutura de dados e ser devidamente estudado no captulo 8.

6. 7.5. Operador de Modelagem de Tipo


Conforme J visto no captulo anterior, a linguagem C dispe de um ope-
rador unrio destinado especificamente a forar a converso do operando
especificado em um tipo de dado determinado. A isto, d-se o nome de mode-
lagem ou typecasting.
A forma geral do operador de modelagem :

( 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.

6. 7.6. Operador Sizeof


O operador sizeof utilizado para retornar a quantidade de memria utili-
zada por uma determinada varivel ou um determinado tipo de dado.
A principal aplicao deste tipo de operador permitir ao programador
:ontrolar a ocupao de memria pelo programa, auxiliando assim na portabl-
ade do programa.
A forma geral do operador :

sizeof varivel OU
sizeof (tipo de dado)

6.8. Associao de Operadores


Para facilitar a vida do programador, a linguagem C inclui ainda uma outra
caracterstica que a abreviao de operadores em atribuies e funciona da
seguinte forma.

Normalmente, as operaes de atribuio mais freqentemente encontra-


cas nos programas possuem a seguinte forma:

varivel = varivel (operando) valor {ou varivel}

Nestes casos, a abreviao de operadores permite economizar a Segunda


escrita da varivel, reduzindo o comando segu inte forma:

varivel (operando) = valor {ou varivel}

Na tabela seguinte , podemos encontrar os tipos de operadores abrevia-


cos admitidos em e.

Forma reduzida Fonna expandida

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

6.9. Precedncia dos Operadores


Na tabela apresentada em seguida, podemos verificar a ordem de prece-
dncia de todos os operadores disponveis na linguagem C. Por ordem de pre-
cedncia entende-se a prioridade na avaliao de mltiplos operadores numa
determinada expresso. Isto significa que operadores de maior ordem de
precedncia sero avaliados primeiramente em relao aos operadores de
menor ordem.

claro que o uso de parentesis em uma expresso, como podemos co-


lher da tabela, permite aumentar a precedncia de avaliao do contedo in-
terno aos mesmos.

Ordem Operador
Maior ( ) [ l ->

-
(tipo) ..
! --sizeof
++
&

/
*
+ -
'
<< >>

<<= > >=

--
-- !=

6c

Tabela 6.8 (Continua)

Microcontroladores PIC - Programao em C


Ordem Operador
~

1
&&

11
.
?

- += -= *= /=

Menor '

Tabela 6.8

No caso de operadores de mesma prioridade ou precedncia, a ordem de


aval:iao a natu ral, ou seja, da esquerda para a direita.

6.10. Exerccios

1) Qual a diferena entre o operador = e o operador =::::?

2) Qual o resultado da expresso (10 && 5)?

3) Qual o resu ltado da expresso (10 ~ 5)?

4) Como avaliada a expresso (x = (10+5) < 20)?

5) Qual o valor de '"x" ao trmino do programa apresentado em seguida,?

int x ,y;
y = 256;
y += l;
X = y >> l;

6) Qual o resu ltado da expresso (10 % 3 + 1)?

7) Qual o valor de "y" ao trmino do programa seguinte?


long ne :x;
int y,z;
z = 100;
y = 10;
X = Z * y + Z && 1;
y = (int ) X;
8) Qual o valor armazenado nas variveis "y" e "z" no programa seguinte?

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~~~~~~~~~
'

Potrebbero piacerti anche