Anda di halaman 1dari 46

Captulo 1

INTRODUO LINGUAGEM DE PROGRAMAO C++


1.1 Hist !i"o #a Li$%ua%&' C++
A linguagem C++ foi desenvolvida em 1982 por Bjarne Stroustrup nos laboratrios da AT&T omo um mel!oramento da linguagem C" desenvolvida !# er a de uma d$ ada antes e bastante popular% A inten&'o de Stroustrup era introdu(ir mel!oramentos na linguagem C" bem omo torn#)la apa( de suportar o paradigma de programa&'o orientadas a objetos% Atualmente C++ $ a linguagem mais utili(ada profissionalmente em todo o mundo e seu estudo fa( parte do urr* ulo da maioria dos ursos de omputa&'o% +entre os prin ipais mel!oramentos introdu(idos em C++ podem ser itados C!e agem r*gida de tipos ,rograma&'o orientada a objetos -eusabilidade .a ilidades para tratamento de e/ e&0es .a ilidades 1in orporadas na prpria linguagem2 para alo a&'o e libera&'o de memria din3mi a .a ilidades para ria&'o de tipos de dados gen$ri os%

4ma das prin ipais ra(0es para o su esso de C++ e o fra asso de outras linguagens de programa&'o orientada a objetos $ 5ue a sinta/e de C++ $ baseada na sinta/e de C" de modo 5ue o programador n'o pre isa desaprender tudo 5ue j# sabia% ,or outro lado" outras linguagens 1puras2 de ,66 1por e/emplo" Smaltal72 introdu(em uma sinta/e inteiramente nova" o 5ue difi ultava seu aprendi(ado por programadores a ostumados om o paradigma tradi ional% 6 padr'o atual da linguagem C++ foi !omologado pelo omit8 9S6 respons#vel em meados de 19981%
6 nome do do umento ofi ial deste padr'o $: IS0/IEC 14882 Standard for the C++ Programming Language 1
1

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1.( Asp&"tos )u$#a'&$tais


1.(.1 I#&$ti*i"a#o!&s & Pala+!as R&s&!+a#as 4m i#&$ti*i"a#o! serve para nomear 1ou rotular2 objetos utili(ados numa dada linguagem de programa&'o% Cada linguagem possui regras prprias para forma&'o de seus identifi adores% 4m identifi ador em C++ deve ser onstitu*do apenas de letras" d*gitos e o ara ter espe ial sublin!a 1;2" sendo 5ue o primeiro elemento onstituinte n'o pode ser um d*gito% 6 n<mero de ara teres permitido para identifi adores depende da implementa&'o de C++ utili(ada" mas o padr'o A=S9 re5uer 5ue ompiladores C++ a eitem" pelo menos" identifi adores ontendo >1 ara teres% =ormalmente" ompiladores modernos d'o liberdade para programadores +en+ato+ es reverem identifi adores do taman!o desejado% 4ma ara ter*sti a importante da linguagem C++ $ 5ue" diferentemente de algumas outras linguagens 1por e/emplo" ,as al2" ela fa( distin&'o entre letras mai<s ulas e min<s ulas% 9sto signifi a" por e/emplo" 5ue duas vari#veis om nomes: minhaVar e MinhaVar s'o diferentes% ?/istem algumas palavras 5ue j# s'o utili(ados pela prpria linguagem C++ 1por e/emplo" ,-il&" *o!2 ou por bibliote as de rotinas 1por e/emplo" a.s" "os2 e" portanto" n'o podem ser utili(ados omo identifi adores pelo programador% ?stas palavras s'o on!e idas omo pala+!as !&s&!+a#as da linguagem% 1.(.( Tipos #& Da#os P!i'iti+os 6s tipos de dados de C++ primitivos 1i%e%" pr$)e/istentes ou embutidos na linguagem2 s'o des ritos a seguir% ipo+ )ritm,ti-o+ 6s tipos aritm$ti os onsistem de dois tipos b#si os de inteiros e dois tipos b#si os de n<meros de ponto flutuante% 6 espa&o o upado em memria por ada um dos objetos destes tipos" bem omo as palavras reservadas 5ue os identifi am" est'o apresentados na Tabela 1% =ote" entretanto" 5ue o espa&o o upado por ada um destes tipos 1 om e/ e&'o do tipo "-a!" 5ue sempre o upa 1 b@te2 depende de implementa&'o e 5ue a Tabela 1 refere)se apenas a uma implementa&'o t*pi a%

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>

PALA/RA0CHA/E i$t "-a! ,"-a!2t *loat #ou.l& .ool

DE1CRIO 9nteiro Cara tere Cara tere largo ,onto flutuante +upla pre is'o Bgi o

TAMANHO A b@tes 1 b@te A b@tes 1 palavra 1A b@tes2 2 palavras 18 b@tes2 1 b@te

Ta.&la 13 Ta'a$-os Tpi"os #& Tipos A!it'4ti"os C interessante notar 5ue" em C++" o tipo "-a! n'o apenas $ utili(ado para representar ara teres" mas tamb$m pode representar inteiros 5ue re5uerem apenas um b@te de memria% 6 tipo i$t pode ainda ser 5uali*i"a#o por meio das seguintes palavras) !ave: s-o!t" lo$%" si%$&# e u$si%$&#% 6s 5ualifi adores si%$&# e u$si%$&# podem tamb$m ser utili(ados para 5ualifi ar o tipo ara tere" e suas interpreta&0es referem)se ao fato de o tipo ser onsiderado om sinal 1 si%$&#2 ou sem sinal 1u$si%$&#2% A 5ualifi a&'o de um tipo $ feita antepondo)se o 5ualifi ador ao nome do tipo 1por e/emplo" si%$&# "-a!D u$si%$&# lo$% i$t2% =o aso dos inteiros" pode)se ainda abreviar s-o!t i$t e lo$% i$t para simplesmente s-o!t e lo$%D si%$&# e u$si%$&# podem ainda ser utili(ados para abreviar si%$&# i$t e u$si%$&# i$t" respe tivamente% =o aso de uso de dois 5ualifi adores" si%$&# ou u$si%$&# deve pre eder s-o!t ou lo$%% =este <ltimo aso" pode)se tamb$m abreviar dei/ando a palavra i$t de fora 1por e/emplo" u$si%$&# lo$% $ o mesmo 5ue u$si%$&# lo$% i$t2% =ote 5ue os pares si%$&# e u$si%$&#" e s-o!t e lo$% s'o mutuamente e/ lusivos 1por e/emplo" n'o fa( sentido se ter um tipo 5ue seja si%$&# e u$si%$&# ao mesmo tempo2% ,or padr'o" o tipo i$t apresenta)se om sinal" en5uanto 5ue o tipo "-a! pode ter sinal ou n'o omo padr'o" dependendo do ompilador utili(ado% =ote 5ue o uso de um tipo sem sinal apro/imadamente dupli a o maior valor positivo 5ue a5uele tipo pode onter% ,or e/emplo" um tipo si%$&# "-a!" 5ue $ representado por um b@te" pode onter 5ual5uer n<mero no intervalo de )128 a 12E" en5uanto 5ue o tipo u$si%$&# "-a! pode onter 5ual5uer n<mero no intervalo de F a 2GG% As interpreta&0es de s-o!t e lo$% para inteiros variam de ompilador para ompilador% ,or e/emplo" num dado ompilador s-o!t i$t e i$t signifi am a mesma oisa 1i%e%" o upam o mesmo espa&o em memria2" en5uanto lo$% i$t o upa o dobro deste espa&oD

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

em outro ompilador" lo$% i$t e i$t o upam o mesmo espa&o em memria" en5uanto s-o!t i$t o upa metade deste espa&o% Apesar desta depend8n ia om o ompilador" s-o!t i$t deve sempre o upar menos espa&o do 5ue lo$% i$t% 6 5ualifi ador lo$% pode tamb$m ser apli ado ao tipo #ou.l&" mas 1novamente2 esta interpreta&'o depende do ompilador utili(ado% ,or e/emplo" lo$% *loat pode ser e5uivalente a #ou.l&D en5uanto 5ue lo$% #ou.l& pode ser simplesmente e5uivalente a #ou.l& ou a um tipo de pre is'o duas ve(es maior do 5ue #ou.l&2% ipo .ool 6 tipo .ool permite representar valores os lgi os verdadeiro e falso atrav$s de seus valores t!u& e *als&" respe tivamente% 1.(.6 /alo!&s Co$sta$t&s ?/istem in o tipos de onstantes em C++: i$t&i!as" de po$to *lutua$t&" "a!a"t&!&s" strings e &$u'&!a78&s% ?stas duas <ltimas ser'o vistas mais adiante% 1/2/0/1 Con+tante+ Inteira+ Constantes inteiras podem ser de tr8s tipos" de a ordo om a base de d*gitos utili(ada: H D&"i'ais% S'o as onstantes inteiras mais utili(adas em programa&'o de alto n*vel e s'o es ritas utili(ando)se os d*gitos de F a 9" sendo 5ue o primeiro d*gito n'o pode ser (ero" a n'o ser" $ laro" 5uando o prprio valor $ (ero% ?/emplos v#lidos de onstantes inteiras de imais: 0" 12004" -67D um e/emplo inv#lido seria 09" pois o mesmo ome&a om F% H O"tais% Constantes inteiras o tais representam n<meros inteiros na base o tal% ?stas onstantes devem ome&ar om 0 1(ero2 e utili(ar os d*gitos de F a E% ?/emplos v#lidos: 00 1representa o n<mero F em o tal2" 07" 07744 % ?/emplos inv#lidos: 085 18 n'o $ um d*gito o tal2" 77 1n'o ome&a om FD portanto seria interpretado om de imal2% H H&9a#&"i'ais% Constantes inteiras !e/ade imais representam n<meros inteiros na base !e/ade imal 11I2% ?stas onstantes devem ome&ar om 0x ou 0X" e utili(ar os d*gitos de F a 9" e as letras de A a F 1A representa 1F" B representa 11" et %2% ?/emplos v#lidos: 0x7FFA" 0X230%

A5ui" pre is'o refere)se ao n<mero de asas de imais 5ue o tipo pode onter%

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

6 n<mero de b@tes alo ados para uma onstante inteira varia de implementa&'o para implementa&'o% ,ode)se e/pli itamente espe ifi ar 5ue uma onstante ten!a o tipo lo$% i$t atrav$s do uso de l ou L no final da onstante 1por e/emplo" 15L" 0XAAB3FL 2% ,ode)se tamb$m espe ifi ar 5ue uma onstante seja do tipo u$si%$&# i$t usando u ou U 1por e/emplo" 15U" 0XAAB3FU 2% 4ma onstante inteira sem sufi/o 1i%e%" sem l" L" u ou U2 tem tipo i$t se seu valor pode ser a omodado neste tipoD aso ontr#rio" o tipo ser# lo$% i$tD se este <ltimo tipo ainda n'o for sufi iente para onter a onstante" o tipo ser# u$si%$&# lo$% i$t% .inalmente" se este n'o for ainda sufi iente" o resultado $ imprevis*vel: alguns ompiladores ir'o t!u$"a! 1i%e%" -ortar2 a onstante para ela aber em memria" en5uanto outros ompiladores ir'o emitir uma mensagem de erro apontando uma ondi&'o de overflow 1taman!o e/ essivo da onstante2% 6 ompilador pro ede de forma similar para onstantes om sufi/oD i%e%" ele tenta primeiro o menor tipo apa( de onter a onstante espe ifi ada pelo sufi/o% ,or e/emplo" o menor tipo apa( de onter uma onstante om sufi/o U 1ou u2 $ u$si%$&# i$t" en5uanto 5ue o maior tipo neste aso $ u$si%$&# lo$% i$t% 6s dois tipos apa(es de onter uma onstante om sufi/o L 1ou l2 s'o lo$% i$t e u$si%$&# lo$% i$t% 1/2/0/2 Con+tante+ de Ponto 1lutuante ?/istem duas formas de se es reverem onstantes de ponto flutuante% A primeira $ simplesmente olo ando)se um ponto de imal em um n<mero" omo por e/emplo:
3.1415 .5 7.

A segunda forma de se es rever uma onstante de ponto flutuante $ atrav$s de $ota7:o "i&$t*i"a% =esta nota&'o" um n<mero de ponto flutuante onsiste de duas partes: 112 'a$tissa e 122 &9po&$t&D esta <ltima representa uma pot8n ia de 1F% ?stas duas partes s'o separadas pela letra & ou E% ,or e/emplo" o n<mero 2E4 deve ser interpretado omo 2x104 e lido omo Jdois ve(es 1F elevado K 5uarta pot8n iaL% A mantissa de um n<mero de ponto flutuante pode ser inteira ou de imalD o e/poente pode ser positivo ou negativo" mas de2e ser inteiro% ,or e/emplo" 2.5E-3 representa o n<mero 2.5x10-3" ou seja" 0.0025% Constantes inteiras ou de ponto flutuante podem ser pre edidas por um sinal de menos ou mais% Constantes pre edidas pelo sinal de menos representam n<meros negativos" en5uanto 5ue o sinal de mais serve para indi ar n<meros positivos e $ redundante" pois um n<mero diferente de (ero e sem sinal $ onsiderado positivo de 5ual5uer forma% =a realidade" em C++" n<meros pre edidos por sinal s'o onsiderados omo e3pre++4e+" e n'o omo -on+tante+%

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1/2/0/0 Cara-tere+ Con+tante+ 4ma onstante do tipo "-a! pode ser representada tanto por um ara tere entre apstrofos 1por e/emplo" 'A'2 5uanto por um n<mero inteiro apa( de ser ontido em um b@te% 4ma onstante ontendo um ara tere entre apstrofos apenas informa ao ompilador 5ue ele deve onsiderar o valor orrespondente ao ara tere no digo de ara teres ora utili(ado% ,or e/emplo" se o digo de ara teres utili(ado $ o ASC99" 5uando o ompilador en ontra a onstante 'A'" ele a interpreta omo o valor 65 1este valor orresponde ao digo ASC99 do ara tere A % ?ste mesmo valor poderia tamb$m ser obtido utili(ando uma onstante do tipo "-a! om o valor 65 1ao inv$s de 'A'2>% 1/2/0/4 Se567n-ia+ de Cara-tere+ de E+-ape 4ma se5M8n ia de ara teres de es ape $ uma se5M8n ia de ara teres entre apstrofos e ujo primeiro ara tere $ N% Se5M8n ias de es ape ontendo dois ara teres representam ara teres n'o)imprim*veis 5ue produ(em ertos efeitos espe iais de sa*da 1usualmente na tela do omputador2 5uando utili(adas em instru&0es de sa*da% Algumas se5M8n ias de es ape omuns s'o as seguintes:
'!n' ) esta se5M8n ia produ( a impress'o de uma nova lin!a no meio de sa*da '!a' ) esta se5M8n ia fa( om 5ue o omputador emita um sinal sonoro O!"' ) esta se5M8n ia produ( uma tabula&'o !ori(ontal no meio de sa*da

Cara teres normais tamb$m podem ser representados por meio de se5M8n ias de ara teres de es ape% =este aso" deve)se es rever o valor orrespondente ao digo do ara tere em nota&'o o tal ou !e/ade imal 1neste <ltimo aso" pre edido por 9 min<s ulo2% ,or e/emplo" se o digo utili(ado $ o ASC99" a letra # poderia ser es rita em se5M8n ia de es ape omo '!132' 1o tal2 ou '!x5A' 1!e/ade imal2% ?sta forma de representa&'o de ara teres n'o $ usualmente ne ess#ria% 1.(.; D&"la!a78&s #& /a!i<+&is 4ma +a!i<+&l em programa&'o de alto n*vel representa uma ou mais posi&0es endere&#veis de memria% ?m C++" toda vari#vel pre isa ser de larada antes de ser usada% ?m geral" vari#veis podem ser de laradas em 5ual5uer ponto de um programa% 4ma de lara&'o de vari#vel em C++ onsiste simplesmente de uma palavra) !ave representando o tipo da vari#vel seguida do nome da vari#vel% Pari#veis de um mesmo
Cui#a#o: no digo ASC99" ara teres representando d*gitos n'o t8m representa&0es internas orrespondentes aos prprios valores dos d*gitosD por e/emplo" as onstantes '5' e 5 n'o s'o a mesma oisa" pois o digo ASC99 orrespondente a '5' $ G>%
>

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

tipo podem ainda ser de laradas juntas e separadas por v*rgulas% ,or e/emplo" a de lara&'o:
int minhaVar$ i$ %&

de lara as vari#veis minhaVar " i e % omo sendo do tipo i$t% C interessante observar 5ue 5uando utili(a)se um 5ualifi ador om o tipo i$t omo tipo de uma vari#vel" a palavra i$t pode ser omitida% ,or e/emplo" as de lara&0es:
unsigned long short int int 'ar(n"& )(n"*ir+&

podem ser abreviadas para:


unsigned long 'ar(n"& short )(n"*ir+&

Seguem algumas re omenda&0es para a es ol!a de identifi adores para vari#veis: ?s ol!a nomes 5ue sejam signifi ativos 1por e/emplo" ma"ri,u-a $ mais signifi ativo do 5ue x ou m2% ?vite utili(ar nomes de vari#veis 5ue sejam muito pare idos ou 5ue difiram em apenas um ara tere 1por e/emplo" .rim*ira/+"a e )*0un1a/+"a s'o mel!ores do 5ue n+"a1 e n+"a2 2% ?vite utili(ar - 1ele2 e + 182 omo nomes de vari#veis pois s'o fa ilmente onfundidos om 1 1um2 e 0 19ero2%

1.(.= Co$sta$t&s 1i'. li"as A linguagem C++ permite 5ue se asso ie um identifi ador om um valor onstante% Tal identifi ador $ denominado "o$sta$t& si'. li"a% 6 uso de onstantes simbli as em um programa tem dois objetivos prin ipais: 112 tornar o programa mais leg*vel 1por e/emplo" 2( $ mais leg*vel do 5ue o valor 3.142" e 122 tornar o programa mais f# il de ser modifi ado% Como ilustra&'o deste segundo ponto" supon!a 5ue o valor onstante 3.14 apare e em v#rios pontos de seu programa% Se vo 8 5uisesse modifi ar este valor 1digamos para 3.14159 2 vo 8 teria de en ontrar todos os valores antigos e substitu*) los% ?ntretanto se este valor fosse representado por uma onstante simbli a de larada no in* io do programa" vo 8 pre isaria fa(er apenas uma modifi a&'o na prpria de lara&'o da onstante%

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

4ma onstante simbli a pode ser definida em C++ atrav$s da #i!&ti+a #& p!40 p!o"&ssa#o! >#&*i$&. ,or e/emplo" supon!a 5ue se deseje denominar de 2( o valor 3.14" ent'o a seguinte diretiva seria sufi iente:
#define 2( 3.14

Quando o programa ontendo a de lara&'o a ima $ ompilado 1ou" mais pre isamente" pr$)pro essado2" o ompilador substitui todas as o orr8n ia de 2( por seu valor de larado 1i%e%" 3.142% As regras para es rita de onstantes simbli as s'o as mesmas da5uelas utili(adas para vari#veis" mas sugere)se 5ue o programador adote uma nota&'o diferente da utili(ada em nomes de vari#veis% A5ui" nomes de onstantes ser'o sempre es ritos em letras mai<s ulas% 1.(.? E$u'&!a78&s 4ma enumera&'o $ <til 5uando se deseja utili(ar um onjunto determinado de valores 5ue podem estar asso iados a uma vari#vel% Quando tenta)se atribuir a uma vari#vel de um tipo enumera&'o um valor 5ue n'o fa( parte da prpria enumera&'o" o ompilador emite uma mensagem de erro% 4ma de lara&'o de vari#vel de um tipo enumera&'o onsiste da palavra reservada enum seguida de uma lista de identifi adores entre !aves" e seguido finalmente pelo nome da vari#vel% ,or e/emplo:
enum 3A#UL$ VE4MEL56$ B4A/76$ 24E869 ,+r&

de lara a vari#vel ,+r omo sendo do tipo enumera&'o 5ue onsiste dos valores onstantes A#UL" VE4MEL56 " B4A/76 e 24E86D estes s'o os <ni os valores 5ue a vari#vel ,+r pode assumir% Palores inteiros s'o asso iados aos nomes de onstantes na lista de enumera&'o de uma vari#vel deste tipo% Caso n'o !aja indi a&'o em ontr#rio" estes valores s'o baseados simplesmente nas posi&0es das onstantes na lista de enumera&'o" sendo 5ue a primeira onstante re ebe o valor F" a segunda onstante re ebe o valor 1" e assim por diante% ,or e/emplo" no e/emplo a ima" A#UL re ebe o valor F" VE4MEL56 re ebe o valor 1" B4A/76 re ebe o valor 2" e 24E86 re ebe o valor >% Ruitas ve(es" estes valores n'o s'o importantes" mas pode ser 5ue" em algumas situa&0es" seja ne ess#rio modifi ar estes valores default% A linguagem C++ permite 5ue se espe ifi5uem valores de onstantes numa enumera&'o% Se o valor de uma dada onstante na enumera&'o n'o for definido e/pli itamente" seu valor ser# o valor da onstante anterior na se5M8n ia a res ido de 1D se o valor da primeira onstante n'o for definido" este ser# (ero 1 omo antes2% ,or e/emplo:

Captulo 1 enum

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

3A#UL : -3$ VE4MEL56$ B4A/76 : 20$ 24E869 ,+r&

=o <ltimo e/emplo" as respe tivamente%

onstantes VE4MEL56 e 24E86 ter'o valores -2 e 21

=ote 5ue n'o se re5uer 5ue as atribui&0es de onstantes sejam feitas em ordem res ente" omo no e/emplo a ima" mas em nome da legibilidade" isto $ re omend#vel% Ao inv$s de definir apenas uma ou mais vari#veis numa dada enumera&'o" pode)se desejar definir v#rias vari#veis de um mesmo tipo enumera&'o em vrios pontos de um programa% A maneira mais simples de se fa(er isto em C++ $ definindo um tipo enumera&'o 5ue pode ser usado para definir as vari#veis desejadas posteriormente% ,or e/emplo" a de lara&'o:
enum "7+r*) 3A#UL : -3$ VE4MEL56$ B4A/76 : 20$ 24E869&

define o tipo "7+r*) 5ue poder# ser usado 1 omo 5ual5uer outro tipo2 para definir vari#veis nos lo ais desejados do programa" omo" por e/emplo:
"7+r*) ,+r;*Fun1+& . . . "7+r*) ,+r;*Fr*n"*&

=este <ltimo e/emplo" as vari#veis ,+r;*Fun1+ e ,+r;*Fr*n"* teriam defini&0es e5Mivalentes K5uelas 5ue teriam se tivessem sido definidas onforme visto no in* io desta se&'o%

1.6 Op&!a#o!&s & E9p!&ss8&s A!it'4ti"os


4ma e/press'o aritm$ti a $ uma ombina&'o legal de op&!a#o!&s e op&!a$#os 5ue denotam o #l ulo de um valor% 6s omponentes de e/press0es in luem vari#veis" onstantes" e !amadas de fun&0es 5ue s'o ombinados por meio de operadores para formar e/press0es mais omple/as% Como ser# visto ao longo do te/to" a linguagem C+ + possui muitos operadores% A seguir" os operadores aritm$ti os de C++ ser'o e/aminados% 1.6.1 Op&!a#o!&s A!it'4ti"os =esta se&'o ser'o abordadas e/press0es aritm$ti as aritm$ti os b#si os" 5ue s'o apresentados na Tabela 2% onstru*das pelos operadores

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1F

OPERADOR 0 + + 0 @ A B

OPERAO Renos un#rio 1invers'o de sinal2 Rais un#rio Adi&'o Subtra&'o Rultipli a&'o +ivis'o -esto da divis'o inteira

Ta.&la (3 Op&!a#o!&s A!it'4ti"os A maioria dos operadores da Tabela 2 fun iona omo em outras linguagens de programa&'o" mas" em C++" e/istem algumas diferen&as% 6 operador + un#rio tem pou a utilidade pr#ti a e na maioria das ve(es $ redundante" uma ve( 5ue ele n'o produ( nen!uma mudan&a de valor 1embora ele possa ausar onvers'o impl* ita omo ser# visto mais adiante2% =ote ainda 5ue n'o e/istem s*mbolos distintos para denotar divis'o inteira e real" omo em algumas outras linguagens de programa&'o 1por e/emplo" #i+ e S em ,as al2% 9sto $" o s*mbolo S serve tanto para divis'o inteira 5uanto para divis'o realD o ompilador dedu( do onte/to se a divis'o $ inteira ou real 1i%e%" se os operandos s'o inteiros" a divis'o ser# inteira2% +eve)se tomar uidado om os operadores S e T 5uando se est# lidando om inteiros negativos" pois o resultado n'o $ espe ifi ado e pode variar de ompilador para ompilador% ,or e/emplo" -5<2 pode resultar em -2 ou -3 dependendo do ompilador% +a mesma forma" evite utili(ar operandos negativos om o operador T 1por e/emplo" -5=2 pode resultar em 1 ou -1 dependendo do ompilador2% 1.6.( P!&"&#C$"ia & Asso"iati+i#a#& A maioria dos operadores aritm$ti os apresentados a ima $ on!e ida de outras linguagens% Tamb$m omo em outras linguagens" C++ avalia e/press0es de a ordo om uma erta ordem de e/e u&'o de opera&0es% ?sta ordem $ determinada por duas propriedades de operadores: p!&"&#C$"ia e asso"iati+i#a#&%

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

11

6peradores aritm$ti os s'o agrupados em grupos de pre ed8n ia onforme mostra a Tabela >% GRUPO DE OPERADORE1 +" ) 1un#rios2 U" S" T +" ) 1bin#rios2 Rais bai/a PRECEDDNCIA Rais alta

Ta.&la 63 P!&"&#C$"ias #& Op&!a#o!&s A!it'4ti"os 6peradores num mesmo grupo na Tabela > t8m a mesma pre ed8n ia% Quando" numa e/press'o" apare em operadores de grupos de pre ed8n ias diferentes" os operadores de mais alta pre ed8n ia s'o apli ados antes dos operadores de pre ed8n ia mais bai/a% ,or e/emplo" a e/press'o:
4 > 3?2

$ avaliada omo 10 1e n'o omo 142" uma ve( 5ue o operador U tem pre ed8n ia maior do 5ue o operador + e" portanto" $ apli ado primeiro% Agora" operadores num mesmo grupo de pre ed8n ia podem apare er juntos numa e/press'o e a 5uest'o 5ue surge $: Se doi+ operadore+ numa e3pre++:o t7m a me+ma pre-ed7n-ia; 5ual dele+ +er< apli-ado primeiro= A resposta para esta 5uest'o est# no uso da segunda propriedade dos operadores: a asso iatividade% ?/istem dois tipos de asso iatividade de operadores: 112 asso"iati+i#a#& #a &s5u&!#a pa!a a #i!&ita e 122 asso"iati+i#a#& #a #i!&ita pa!a a &s5u&!#a% 6peradores 5ue apresentam asso iatividade da es5uerda para a direita s'o ditos serem asso"iati+os E &s5u&!#aD aso ontr#rio" eles s'o asso"iati+os E #i!&ita% +entre os operadores apresentados a ima" apenas os operadores un#rios s'o asso iativos K direitaD todos os outros s'o asso iativos K es5uerda% A asso iatividade K es5uerda agrupa operadores de mesma pre ed8n ia da es5uerda para a direita 1ou mel!or" o ompilador ome&a a e/e utar as opera&0es da es5uerda para a direita2% ,or e/emplo" a e/press'o:
8<2<2

$ interpretada omo @8<2 <2 Ve n'o omo 8<@2<2 W" uma ve( 5ue o operador S $ asso iativo K es5uerda" e resulta" portanto" em 2 1e n'o em 82% ,ode)se alterar a ordem de e/e u&'o de uma e/press'o por meio do uso de par8nteses% 6 ompilador C++ e/e uta opera&0es entre par8nteses antes de 5ual5uer outra

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

12

opera&'o independentemente de pre ed8n ia ou asso iatividadeA% Resmo 5uando s'o desne ess#rios 1i%e%" redundantes para o ompilador2" par8nteses tamb$m s'o muito <teis para tornar e/press0es omple/as mais leg*veis% C sempre uma boa id$ia olo ar e/press0es omple/as entre par8nteses" pois isto n'o apenas assegura 5ue a e/press'o seja avaliada orretamente omo tamb$m permite 5ue a mesma seja lida sem a ne essidade de refer8n ia a tabelas de pre ed8n ia e asso iatividade% 1.6.6 Mistu!a #& Tipos & Co$+&!s8&s Auto'<ti"as C++ permite 5ue tipos aritm$ti os 1num$ri os2 sejam misturados em e/press0es% ?ntretanto" para 5ue tais e/press0es fa&am sentido" o ompilador e/e uta "o$+&!s8&s auto'<ti"as 1ou i'pl"itas2% ?stas onvers0es muitas ve(es s'o respons#veis por resultados inesperados e" portanto" o programador deve estar absolutamente iente das transforma&0es feitas impli itamente pelo ompilador antes de misturar tipos numa e/press'o aritm$ti aD aso ontr#rio" $ mel!or evitar definitivamente a mistura de tipos% ?/istem 5uatro tipos de onvers0es feitas impli itamente pelo ompilador C++% Tr8s delas ser'o dis utidas a5ui% ?las s'o: H Co$+&!s:o #& At!i.ui7:o% =este tipo de onvers'o" o valor do lado direito de uma atribui&'o $ onvertido para o tipo do lado es5uerdo% 6 problema 5ue pode o orrer om este tipo de onvers'o $ 5uando o tipo do lado es5uerdo $ mai+ -urto do 5ue o tipo do lado direito% ,or e/emplo" se , $ uma vari#vel do tipo "-a!" a atribui&'o:
, : 882

pode resultar" na realidade" na atribui&'o do valor 114 a ,% ,or 5ue isto o orreX ,rimeiro" o valor 882 $ grande demais para aber no tipo "-a! 15ue o upa apenas um b@te2% Segundo" pode)se observar 5ue 882 $ representado em 1I bits pela se5M8n ia:
00000011 01110010

Ras" omo o tipo "-a! deve ser ontido em apenas 8 bits" o ompilador onsidera apenas os 8 bits mais bai/os da se5M8n ia:
01110010

5ue e5Mivale a 114%


6bviamente" se e/istem v#rios operadores dentro de uma e/press'o entre par8nteses" as regras de pre ed8n ia e asso iatividade ser'o apli adas para estes operadores para determinar a ordem de opera&0es dentro dos par8nteses%
A

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1>

H Co$+&!s:o #& Ala!%a'&$to #& I$t&i!os% Quando apare em numa e/press'o" os tipos si%$&# "-a! e s-o!t s'o onvertidos para i$tD en5uanto 5ue tipos u$si%$&# "-a! e u$si%$&# s-o!t s'o onvertidos para i$t 1se ouberem2 ou u$si%$&# i$t% ?ste tipo de onvers'o $ inevit#vel" mas n'o produ( nen!um efeito indesej#vel% H Co$+&!s:o #& Co'pati.ili#a#& #& Op&!a$#os% Pari#veis e onstantes s'o onvertidos de modo 5ue um dado operador ten!a omo operandos valores do mesmo tipo% ?sta onvers'o obede e a uma !ierar5uia de tipos" de tal modo 5ue um tipo de menor apa idade $ onvertido para um tipo de maior apa idade% ,or e/emplo" se numa e/press'o om dois operandos de tipos diferentes" um deles $ do tipo lo$% #ou.l& 1maior apa idade2" o outro operando 1menor apa idade2 $ onvertido para lo$% #ou.l&% ,or e/emplo" se x $ do tipo i$t e A $ do tipo *loat na e/press'o abai/o:
x<A

ent'o" a vari#vel x ser# onvertida automati amente para *loat% Conforme foi visto anteriormente" onvers0es impl* itas podem gerar alguns resultados inesperados% ,ortanto" s'o re omendados os seguintes uidados rela ionados a misturas de tipos: 1% ?vite misturar tipos em e/press0es% Com esta medida vo 8 estar# definitivamente livre de poss*veis resultados inesperados% 2% Se a mistura de tipos for inevit#vel" teste o programa e/austivamente para ertifi ar)se 5ue isto n'o a arreta em problemas% Bembre)se ainda 5ue" neste aso" seu programa pode ser dependente de plataforma% 1.6.= At!i.ui7:o A instru&'o mais simples em C++ $ a instru&'o de at!i.ui7:o% 4ma instru&'o deste tipo preen !e o espa&o em memria representado por uma vari#vel om um valor determinado e sua sinta/e tem a seguinte forma geral: Yvari#velZ [ Ye/press'oZD

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1A

A interpreta&'o para uma instru&'o de atribui&'o $ a seguinte: a >e3pre++:o? $ avaliada e o valor resultante $ arma(enado no espa&o de memria representado pela vari#vel% Quando um espa&o em memria $ alo ado para onter uma vari#vel" o onte<do deste espa&o 1i%e%" o valor da prpria vari#vel2 pode +er indeterminadoG% 9sto signifi a 5ue n'o se deve fa(er nen!uma suposi&'o sobre o valor de uma vari#vel antes 5ue a mesma assuma um valor explicitamente atribu*do% \s ve(es $ desej#vel 5ue uma vari#vel assuma um erto valor logo no in* io do programa 1ou fun&'o2% ?sta i$i"ialiFa7:o pode ser feita em C++ ombinando)se a de lara&'o da vari#vel om a atribui&'o do valor desejado% ,or e/emplo" supon!a 5ue se deseje atribuir o valor 0 a uma vari#vel inteira minhaVar % ?nt'o isto poderia ser feito atrav$s da seguinte de lara&'o:
int minhaVar : 0&

6 sinal de igualdade utili(ado em atribui&'o tamb$m $ um operador e sua asso iatividade $ K direita% Al$m disso" o operador de atribui&'o pode ser utili(ado para a e/e u&'o de m<ltiplas atribui&0es numa <ni a lin!a de instru&'o% ,or e/emplo" se x" A" e B s'o do tipo i$t" a atribui&'o omposta:
x : A : B : 1&

resulta na atribui&'o de 1 a B" B 1i%e%" 12 a A" e A 1i%e%" 12 a x" nesta ordem% =este aso" x" A e B ter'o" no final da e/e u&'o da instru&'o" o mesmo valor" mas isto nem sempre a onte e numa atribui&'o m<ltipla pois podem o orrer onvers0es impl* itas% Considere o seguinte e/emplo:
int double %& 1&

% : 1 : 2.5&

=este <ltimo e/emplo" 1 re ebe o valor 2.5" mas % re ebe o valor 2 1o valor de 1 onvertido para i$t2% E9&!""io: Que valores re eberiam 1 e % na atribui&'o 1 : % : 2.5X ?/istem in o outros operadores de atribui&'o 5ue ombinam opera&0es aritm$ti as om atribui&'o em instru&0es <ni as% ?stes operadores" denominados de op&!a#o!&s #& at!i.ui7:o a!it'4ti"a" e seus e5uivalentes fun ionais s'o apresentadas na Tabela A%
?/istem situa&0es nas 5uais o onte<do de uma vari#vel $ automati amente preen !ido om (eros" onforme ser# visto mais adiante%
G

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1G

OPERADOR a +[ b a )[ b a U[ b a S[ b a T[ b

EGUI/ALENTE A a[a+b a[a)b a[aUb a[aSb a[aTb

Ta.&la ;3 Op&!a#o!&s #& At!i.ui7:o A!it'4ti"a Todos os operadores de atribui&'o 1in luindo :2 fa(em parte de um mesmo grupo de pre ed8n ia bai/*ssima" e a asso iatividade destes operadores $ da direita para a es5uerdaI% Bevando em onta a bai/a pre ed8n ia dos operadores de atribui&'o" a instru&'o:
% ?: 2 > 3

seria interpretada omo:


% : %?@2 > 3

1e n'o omo % : %?2 > 32%

1.6.? Op&!a#o!&s #& I$"!&'&$to & #& D&"!&'&$to 6s operadores de in remento e de de remento s'o operadores un#rios 5ue" 5uando apli ados a uma vari#vel" adi ionam ou subtraem 1" respe tivamente% ?stes operadores apli am)se a vari#veis num$ri as ou do tipo ponteiro E% 6s operadores de in remento e de de remento s'o representados respe tivamente pelos s*mbolos >> e --" e t8m a mesma pre ed8n ia dos operadores un#rios > e -% ?/istem duas vers0es para ada um destes operadores: 112 p!&*i9a e 122 su*i9a% ?sta lassifi a&'o refere)se K posi&'o do operador om rela&'o ao operando% Se o operador apare e antes do operando 1por e/emplo" >>x2" ele $ um operador prefi/oD aso
=a realidade" os operadores de atribui&'o t8m a pre ed8n ia mais bai/a do 5ue as pre ed8n ias de todos os outros operadores de C" om a e/ e&'o do operador J $L" 5ue ser# visto posteriormente% E A interpreta&'o de in remento e de remento de ponteiros $ diferente da apresentada a5ui" onforme ser# visto mais adiante%
I

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1I

ontr#rio 1por e/emplo" x>>2" ele $ sufi/o% Todos estes operadores produ(em &*&itos "olat&!ais nas vari#veis sobre as 5uais atuam% ?stes efeitos olaterais orrespondem e/atamente ao in remento 1i%e%" a r$s imo de 1 ao valor2 ou de remento 1i%e%" subtra&'o de 1 ao valor2 da vari#vel% Com rela&'o a efeitos olaterais" n'o e/iste diferen&a 5uanto ao uso da forma prefi/a ou sufi/a de ada um desses operadores% 9sto $" 5ual5uer um dos dois operadores de in remento produ( o mesmo efeito de in remento" e 5ual5uer um dos dois operadores de de remento produ( o mesmo efeito de de remento% A diferen&a entre as vers0es prefi/a e sufi/a de ada um desses operadores est# no resultado da opera&'o% 6s operadores sufi/os resultam no prprio valor da varivel sobre a 5ual atuamD por outro lado" operadores prefi/os resultam no valor da vari#vel aps o efeito colateral 1i%e%" in remento ou de remento2 ter o orrido% ,ortanto" se o resultado de uma opera&'o de in remento ou de de remento n'o for utili(ado" n'o fa( diferen&a se o operador utili(ado $ prefi/o ou sufi/o% ,or e/emplo" no tre !o de programa a seguir:
int A$ x : 2&

A : 5?x>>& A re ebe o valor 10" en5uanto 5ue se a instru&'o de in remento fosse: A : 5?>>x A re eberia o valor 15% ?m ambos os asos" entretanto" a vari#vel x seria in rementada para 3 1i%e%" o efeito olateral seria o mesmo2%

Supondo 5ue x $ uma vari#vel de um tipo es alar" os resultados dos operadores de in remento e de de remento podem ser resumidos na Tabela G%

Op&!a7:o /++ /)) ++/ ))/

D&$o'i$a7:o in remento sufi/o

/alo! #a E9p!&ss:o o mesmo de /

E*&ito Colat&!al adi iona 1 a / subtrai 1 de / adi iona 1 a / subtrai 1 de /

de remento sufi/o o mesmo de / in remento prefi/o o valor de / mais 1 de remento prefi/o o valor de / menos 1

Ta.&la =3 Op&!a#o!&s #& I$"!&'&$to & #& D&"!&'&$to

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

1E

Ruitas ve(es 1talve(" na maioria das ve(es2" o programador est# interessado apenas no efeito olateral de um operador de in remento ou de de remento% 6 programador deve preo upar)se om a diferen&a entre operadores prefi/o e sufi/o apenas 5uando os valores resultantes de e/press0es formadas por estes operadores forem utili(ados% ,or outro lado" n'o $ re omend#vel o uso de uma vari#vel afetada por um operador 5ue produ( efeito olateral na mesma e/press'o em 5ue o orre tal efeito% ?sta re omenda&'o deve)se ao fato de n'o ser espe ifi ado" nestes asos" 5uando o efeito olateral ir# o orrer% ,or e/emplo" onsidere o seguinte tre !o de programa:
int i$ % : 4&

i : % ? %>>&

A linguagem C++ n'o espe ifi a 5ual dos operandos da multipli a&'o $ avaliado primeiro e" portanto o resultado a ser atribu*do a i ir# depender da interpreta&'o do ompilador% Se o primeiro % for avaliado primeiro" a e/press'o ser# resultar# em 16 1i%e%" 4?42D se %>> for avaliado primeiro" o resultado ser# 20 1i%e%" 5?428% 1.6.H O Op&!a#o! siF&o* 6 operador siF&o* $ um operador prefi/o de pre ed8n ia igual K dos operadores + e ) un#rios" e om asso iatividade da direita para a es5uerda% ?ste operador pode re eber omo operando um tipo de dado 1predefinido ou definido pelo programador2 ou uma e/press'o% Quando apli ado a um tipo de dados" o operador siF&o* resulta no n<mero de b@tes ne ess#rios para alo ar uma vari#vel da5uele tipo% =este aso" o operando deve ser olo ado entre par8nteses% ,or e/emplo"
unsigned long int "amanh+;+8i.+;+uC-* = sizeof @double &

resulta na ini iali(a&'o da vari#vel "amanh+;+8i.+;+uC-* om o n<mero de b@tes ne ess#rios para onter uma vari#vel do tipo #ou.l& na implementa&'o de C++ utili(ada% Quando apli ado a uma e/press'o" o operador siF&o* resulta no n<mero de b@tes 5ue seriam ne ess#rios para onter o resultado da e/press'o se a mesma fosse avaliada% A e/press'o em si no avaliada% Quando o operando do operador siF&o* $ uma
Po 8 pode ter fi ado intrigado om este e/emplo% Afinal" vo 8 pode pensar" o operador ++ tem pre ed8n ia maior do 5ue a pre ed8n ia do operador ? e" portanto" deve ser apli ado antes da multipli a&'o% ,or$m" a onte e 5ue pre ed8n ia refere)se K ordem de avalia&'o de sub) e/press0es 5ue o orrem dentro de uma e/press'o e n'o a efeitos olaterais de operadores% A e/press'o %>> resulta sempre em 4" independentemente do ompilador utili(ado%
8

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

18

e/press'o" a mesma n'o pre isa ser olo ada entre par8nteses" por$m o uso destes $ sempre re omend#vel% Segundo o padr'o A=S9" o resultado do operador siF&o* deve ser u$si%$&# i$t ou u$si%$&# lo$% i$t %

1.; Op&!a#o!&s R&la"io$ais & L %i"os


Op&!a#o!&s !&la"io$ais s'o operadores bin#rios utili(ados em &9p!&ss8&s #& "o'pa!a7:o% ?/istem seis operadores rela ionais em C++" 5ue s'o apresentados juntamente om seus poss*veis resultados" na Tabela I apresentada a seguir:

OPERADOR I IJ

DENOMINAO maior do 5ue maior do 5ue ou igual a menor do 5ue menor do 5ue ou igual a igual a diferente de

APLICAO aI. a IJ .

RE1ULTADO t!u& se a $ maior do CD *als&" aso ontr#rio t!u& se a $ maior do 5ue ou igual a CD *als&" aso ontr#rio t!u& se a $ menor do CD F" aso ontr#rio t!u& se a $ menor do 5ue ou igual a CD *als&" aso ontr#rio t!u& se a $ igual a CD *als&" aso ontr#rio t!u& se a $ diferente de CD *als&" aso ontr#rio

K KJ

aK. a KJ .

JJ LJ

a JJ . a LJ .

Ta.&la ?3 Op&!a#o!&s R&la"io$ais 6s 5uatro primeiros operadores na Tabela I t8m a mesma pre ed8n ia" 5ue $ menor do 5ue as pre ed8n ias dos operadores vistos antes" om e/ e&'o dos operadores de

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

19

atribui&'o% 6s dois <ltimos operadores est'o uma lasse de pre ed8n ia abai/o dos 5uatro primeiros operadores% =ote 5ue o operador rela ional de igualdade $ representado pelo s*mbolo :: e n'o por [ omo em algumas linguagens% 6 programador deve se prevenir ontra este tipo de engano pois ele $ uma fonte muito omum de erros de programa&'o 5ue n'o s'o apontados pelo ompilador% ?ste erro $ muitas ve(es dif* il de ser lo ali(ado pois" o uso por engano do operado [ ao inv$s de :: $ sintaticamente legal em C++" embora" fre5Mentemente" resulte numa interpreta&'o diferente da pretendida 1voltaremos a dis utir este problema oportunamente2% 6utro uidado 5ue o programador deve tomar om o uso do operador de igualdade $ 5ue o mesmo n'o deve ser utili(ado para omparar n<meros de ponto flutuante pois o omputador pode arma(enar estes n<meros de forma apro/imada% ,or e/emplo" a e/press'o rela ional:
@2.0<3 > 2.0<3 > 2.0<3 :: 2.0

usualmente" n'o resulta em 1 onforme seria esperado 1empregando um ra io *nio matem#ti o2% 9sto deve)se ao fato de ada termo entre par8nteses resultar numa d*(ima infinita 10.6666%%%2 5ue n'o pode ser ompletamente arma(enada no omputador% ,or ausa disso" a e/press'o entre par8nteses poderia resultar" por e/emplo" em 2.00000001 " 5ue n'o $ igual a 2.0% ,ara ontornar este problema" o programador poderia utili(ar outro operador rela ional 1por e/emplo" Z[ ou Y[2 ao inv$s do operador de igualdade 5uando omparar n<meros de ponto flutuante% Op&!a#o!&s l %i"os em C++ orrespondem aos operadores de $&%a7:o 1/682" "o$Mu$7:o 1A/;2 e #isMu$7:o 1642 de outras linguagem" omo" por e/emplo" ,as al% 6s operadores lgi os em C++ podem re eber omo operandos 5uais5uer valores inteiros" booleanos ou de ponto flutuante% 6s operadores lgi os de C++ s'o apresentados 1em ordem de res ente de prioridade2 na Tabela E%

OPERADOR =ega&'o Conjun&'o +isjun&'o

1NMOOLO L PP QQ

Ta.&la H3 Op&!a#o!&s L %i"os

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

2F

6 operador lgi o L tem a mesma pre ed8n ia dos operadores un#rios vistos anteriormente% 6s operadores lgi os PP e QQ t8m pre ed8n ias mais bai/as do 5ue operadores aritm$ti os e rela ionais" mas n'o fa(em parte de um mesmo grupo de pre ed8n ia: o operador PP tem pre ed8n ia mais alta do 5ue o operador QQ% A apli a&'o de operadores lgi os sempre resulta em *als& ou t!u&" dependendo dos valores dos operandos% 6s resultados dos valores resultantes da apli a&'o destes operadores de a ordo om os valores de seus operandos s'o resumidos na Ta.&la R e na Ta.&la 1S apresentadas a seguir%

!X

F ou *als& diferente de F ou t!u&

t!u& *als&

Ta.&la T3 R&sulta#os #o Op&!a#o! L

X PP Y

X QQ Y

F ou *als& F ou *als& diferente de F ou t!u& diferente de F ou t!u&

F ou *als& diferente de F ou t!u& F ou *als& diferente de F ou t!u&

*als& *als& *als& t!u&

*als& t!u& t!u& t!u&

Ta.&la R3 R&sulta#os #os Op&!a#o!&s PP & QQ ,ara memori(ar a Ta.&la 1S" vo 8 pre isa apenas onsiderar 5ue a apli a&'o de PP resulta em t!u& apenas 5uando os dois operandos s'o diferentes de (ero ou s'o t!u&D aso ontr#rio" o resultado $ *als&% Tamb$m" X QQ D resulta em *als& apenas 5uando ambos os operandos s'o *als&% A ordem de avalia&'o de operandos de e/press0es lgi as $ espe ifi ada omo sendo da es5uerda para a direita% Al$m disso" o ompilador n'o avalia operandos 5ue n'o sejam ne ess#rios para a determina&'o do valor de uma e/press'o lgi a% ,or e/emplo" 5uando o valor de a for (ero na e/press'o:
@a E: 0 FF @C<a G 4.0

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

21

o operando a E: 0 resulta em *als& e o ompilador n'o avalia o operando C<a G 4.0 pois sabe)se 5ue para 5ue toda a e/press'o resulte em *als&" basta 5ue um dos operadores seja *als& 9% 4ma observa&'o final 5uanto ao uso de e/press0es rela ionais e lgi as $ 5ue o programador deve evitar 1ou" pelo menos" tomar bastante uidado om2 o uso de operadores om efeitos olaterais" omo os operadores de in remento e de remento% 6 problema a5ui $ 5ue" onforme visto a ima" o ompilador nem sempre avalia ompletamente algumas e/press0es lgi as% Considere o seguinte e/emplo:
@a G C FF @, :: 1>>

=esta situa&'o" a vari#vel 1 ser# in rementada apenas 5uando a for maior do 5ue C e talve( o programador desejasse 5ue a mesma vari#vel fosse in rementada sempre 5ue esta instru&'o fosse e/e utada%

1.= Est!utu!as #& Co$t!ol&


=ormalmente" um programa $ e/e utado se5Men ialmente" da primeira K <ltima instru&'o% 4sualmente" entretanto" o flu/o normal de e/e u&'o de um programa $ alterado por meio de &st!utu!as #& "o$t!ol& 5ue provo am desvios e repeti&0es de ertas instru&0es% As estruturas de ontrole em C++ podem ser lassifi ados em tr8s ategorias: D&s+ios "o$#i"io$ais 5ue permitem de idir" por meio de uma ondi&'o" se uma por&'o do programa ser# e/e utada ou n'o% D&s+ios i$"o$#i"io$ais 5ue indi am in ondi ionalmente 5ue instru&'o ser# e/e utada em seguida% R&p&ti78&s 1ou it&!a78&s2 5ue permitem a e/e u&'o de uma ou mais instru&0es repetidamente at$ 5ue uma ondi&'o seja satisfeita%

1.=.1 1&5UC$"ias #& I$st!u78&s Antes de prosseguir om a apresenta&'o das estruturas de ontrole de C++" $ interessante des rever a5ui o on eito de s&5UC$"ia #& i$st!u78&s 1ou i$st!u78&s "o'postas2% 4ma se5M8n ia de instru&0es onsiste de mais de uma instru&'o" e pode ser
?sta $ uma ara ter*sti a boa das linguagens C e C++% 6utras linguagens meno+ inteligente+ tentariam avaliar o segundo operando 5uando a fosse 0" o 5ue resultaria num erro em tempo de e/e u&'o do programa%
9

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

22

inserida em 5ual5uer lo al em um programa onde uma <ni a instru&'o $ permitida% Se5M8n ias de instru&0es devem ser olo adas entre !aves 1i%e%" entre J]L e J^L2% 1.=.( I$st!u78&s /aFias 6utro aspe to interessante da linguagem C++ $ 5ue ela permite a es rita de i$st!u78&s +aFias 1i%e%" 5ue n'o e/e utam nen!uma tarefa2 em 5ual5uer lo al aonde pode)se olo ar uma instru&'o normal% 4ma instru&'o va(ia em C++ $ representada por JDL 1ponto)e)v*rgula2" e $ sempre uma boa id$ia olo ar instru&0es va(ias em lin!as separadas e a ompan!adas de oment#rios1F e/pli ativos% ?stas re omenda&0es para es rita de instru&0es va(ias evitam 5ue instru&0es deste tipo 5ue s'o propositais sejam onfundidas om a5uelas 5ue s'o acidentais 1i%e%" bugs2% Como" isoladamente" _&_ signifi a a instru&'o va(ia" a olo a&'o a idental deste s*mbolo em lo ais aonde espera) se uma instru&'o normal ser# interpretada pelo ompilador omo uma onstru&'o v#lida" mas pode ser 5ue isto n'o seja o desejado pelo programador 1um e/emplo disto ser# apresentado na se&'o a seguir2% 1.=.6 La7os #& R&p&ti7:o As estruturas de ontrole de repeti&'o de C++ ser'o des ritas nesta se&'o% 1/@/0/1 LaAo de !epetiA:o while A instru&'o ,-il& $ uma estrutura de repeti&'o 5ue tem o seguinte formato em C++:

,-il& 1Ye/press'oZ2 Yinstru&'oZ

A e/press'o entre par8nteses $ uma ondi&'o de teste e $ muitas ve(es 1mas n'o ne essariamente2 uma e/press'o rela ional% A instru&'o endentada na lin!a seguinte no es5uema a ima $ denominado de "o!po #o la7o ,-il& e pode ser representada por uma se5M8n ia de instru&0es entre !aves% Cui#a#o: se vo 8 es5ue er de olo ar as !aves em torno de uma se5M8n ia de instru&0es" apenas a primeira instru&'o ser# onsiderada
Coment#rios em C++ podem ser es ritos entre os s*mbolos <? e ?< ou ome&ados om SS e terminados no final da lin!a" onforme ser# visto mais adiante%
1F

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

2>

omo sendo o orpo do ,-il&% ,or isso" mesmo 5uando o orpo da instru&'o ,-il& $ onstitu*do por uma <ni a instru&'o" $ sempre uma boa id$ia olo #)lo entre !aves% 9sto evita 5ue vo 8 es5ue&a de in lu*)las se por a aso 5uiser a res entar alguma instru&'o ao orpo do ,-il&% ?sta <ltima re omenda&'o $ v#lida para outras estruturas de ontrole" e n'o apenas para o ,-il&% A instru&'o ,-il& $ interpretada onforme des rito a seguir% A e/press'o entre par8nteses $ avaliada e" se o resultado desta e/press'o for diferente de (ero 1ou t!u&2" o orpo do la&o ser# e/e utado% ?nt'o" o ontrole do programa retorna para o topo da instru&'o ,-il& e o pro esso $ repetido at$ 5ue a e/press'o seja avaliada omo (ero 1ou *als&2% Quando isto o orre" o ontrole passa para a instru&'o 5ue segue toda a instru&'o ,-il&% =ote 5ue se ini ialmente a e/press'o resultar em (ero" o orpo do la&o n'o ser# e/e utado nen!uma ve(% ?/emplo de uso da instru&'o ,-il&:
long x : 0L$ A : 10L& 3

while @x H A x>>& A--& 9

E9&!""io: Quantas ve(es o orpo do la&o ,-il& do e/emplo a ima ser# e/e utadoX +e a ordo om o 5ue foi visto na se&'o anterior" deve)se tomar uidado para n'o es rever _&_ aps a primeira lin!a de uma instru&'o ,-il& pois o orpo da mesma ser# interpretada omo sendo a instru&'o va(ia% ,or e/emplo:
while @x & x--& << E)"a in)"ruIJ+ )*rK *x*,u"a1a *xa"am*n"* uma '*B << )* + 'a-+r 1* x L+r 0 * + .r+0rama *n"rarK *m -++. << )*m Lim )* + 'a-+r 1* x L+r 1iL*r*n"* 1* 0

=o e/emplo a ima" o programador pretendia 5ue o orpo do la&o fosse x-- 1 onforme sugerido pela endenta&'o2" mas na realidade o orpo ser# a instru&'o va(ia 1i%e%" o ponto)e)v*rgula no final da primeira lin!a2% A re omenda&'o de pre au&'o para n'o es rever ponto)e)v*rgula em lo ais indevidos vale para outras estruturas de ontrole vistas a seguir% 1/@/0/2 LaAo de !epetiA:o do-while A instru&'o #o0,-il& $ outra estrutura de repeti&'o de C++ uja sinta/e segue o es5uema a seguir:

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

2A

#o Yinstru&'oZ ,-il& 1Ye/press'oZ2

Como na instru&'o ,-il& vista antes" >in+truA:o? representa o orpo do la&o e >e3pre++:o? $ uma e/press'o 5ue deve resultar em (ero 1 *als&2 ou diferente de (ero 1t!u&2% ?m termos de interpreta&'o" a <ni a diferen&a entre ,-il& e #o0,-il& $ o ponto aonde a ondi&'o de teste $ avaliada% =a instru&'o ,-il&" a ondi&'o $ avaliada no in* io do la&o" en5uanto 5ue na instru&'o #o0,-il& a ondi&'o $ avaliada no final do mesmo% ,or ausa disso" garante)se 5ue o orpo de uma instru&'o #o0,-il& seja e/e utado pelo menos uma ve(% ,ortanto" a instru&'o #o0,-il& $ indi ada para situa&0es aonde deseja) se 5ue o orpo do la&o seja e/e utado pelo menos uma ve(% ?/emplo de uso da instru&'o #o0,-il&:
long x : 0L$ A : 10L&

do 3 x>>& A--& 9 while @x H A

E9&!""io: ?/iste alguma diferen&a entre a instru&'o #o0,-il& do <ltimo e/emplo e o e/emplo de instru&'o ,-il& apresentado anteriormenteX Quantas ve(es o orpo do la&o #o0,-il& do e/emplo a ima ser# e/e utadoX 1/@/0/0 LaAo de !epetiA:o for A instru&'o *o! $ a <ltima das tr8s instru&0es de repeti&'o de C++% A sinta/e da instru&'o *o! segue o seguinte es5uema: *o! 1>e3pre++:o1?D >e3pre++:o2?D >e3pre++:o0?2 Yinstru&'oZD

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

2G

Qual5uer das e/press0es entre par8nteses $ op ional" mas usualmente todas as tr8s s'o utili(adas% 4ma instru&'o *o! $ interpretada onforme a seguinte se5M8n ia de passos: 1% >e3pre++:o1? $ avaliada% 4sualmente" esta $ uma ou e/press0es de atribui&'o para uma ou mais vari#veis% 2% >e3pre++:o2?" 5ue $ a ondi&'o de teste da estrutura *o!" $ avaliada% >% Se >e3pre++:o2? resultar em (ero 1*als&2" a instru&'o *o! $ en errada e o ontrole do programa passa para a instru&'o seguinte a toda instru&'o *o!% Se >e3pre++:o2? resultar num valor diferente de (ero 1t!u&2" o orpo do la&o 1representado por >in+truA:o? no es5uema a ima2 $ e/e utado% A% Aps a e/e u&'o do orpo do la&o 1se for o aso no passo >2" >e3pre++:o0? $ avaliada e retorna)se ao passo 2 a ima% ,ode)se fa ilmente verifi ar 5ue a instru&'o for $ exatamente e5uivalente em termos fun ionais K seguinte se5M8n ia de instru&0es:
H*x.r*))J+1G& while @H*x.r*))J+2G 3 Hin)"ruIJ+G& H*x.r*))J+3G& 9

Apesar desta e5Mival8n ia" este onjunto de instru&0es n'o $ indi ado 1por 5uest'o de legibilidade2 para substituir instru&0es *o! aonde a utili(a&'o desta instru&'o pare e ser a es ol!a mais natural% ?m parti ular" a instru&'o *o! torna mais f# il verifi ar as mudan&as de valor de vari#veis usualmente ontidas em >e3pre++:o0?% A instru&'o *o! de C++ $ mais fre5Mentemente utili(ada em la&os de ontagem omo a instru&'o *o! de ,as al% ,or e/emplo:
for @% : 1& % H: 10& %>> 3

<< M*NOPn,ia 1* in)"ruIQ*) a )*r << *x*,u"a1a 10 '*B*) r*.*"i1am*n"* 9

$ e5Mivalente K seguinte instru&'o ,as al:


for % R: 1 to 10 do begin @? M*NOPn,ia 1* in)"ruIQ*) a )*r ? @? *x*,u"a1a 10 '*B*) r*.*"i1am*n"* ? end

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

2I

E9&!""io: =o <ltimo e/emplo" %>> poderia ser substitu*do por >>%X ,or 5ueX 4m erro omum em instru&0es omo a apresentada no <ltimo e/emplo $ e/e utar o orpo do *o! um n<mero de ve(es diferente do pretendido devido ao uso de um operador rela ional inade5uado 1por e/emplo" utili(ar H em ve( de H:2% ,or e/emplo" se a ondi&'o de teste utili(ada no e/emplo anterior fosse % H 10" ao inv$s de % H: 10 omo antes" o orpo do *o! seria e/e utado apenas 9 ve(es 1e n'o 1F ve(es" omo antes2% ?ste tipo de erro obviamente n'o $ indi ado pelo ompilador e $ muitas ve(es dif* il de ser dete tado% A mel!or forma de prevenir este tipo de erro $ testar ada la&o de ontagem at$ onven er)se de 5ue ele realmente fun iona onforme o esperado% Conforme foi men ionado antes" 5ual5uer das e/press0es entre par8nteses pode ser omitida numa instru&'o *o!% ?ntretanto" os dois ponto)e)v*rgulas devem sempre ser in lu*dos% =a pr#ti a" $ omum omitir)se >e3pre++:o1? ou >e3pre++:o0?" mas nun a ambas ao mesmo tempo11% =ormalmente" >e3pre++:o2? $ sempre in lu*da" pois trata)se da ondi&'o de teste% Quando esta ondi&'o de teste $ omitida" ela $ onsiderada omo se fosse igual a 1 1i%e%" sempre verdadeira2% ?videntemente" pode)se tamb$m utili(ar uma instru&'o nula omo orpo de um la&o *o!% ?ste tipo de onstru&'o $ utili(ado 5uando a tarefa desejada $ e/e utada pelas prprias e/press0es entre par8nteses% 1/@/0/4 LaAo+ de !epetiA:o Infinito+ La7os #& !&p&ti7:o i$*i$itos s'o a5ueles ujos orpos s'o e/e utados indefinidamente% Algumas ve(es" um la&o de repeti&'o infinito $ a5uilo 5ue realmente o programador deseja" mas muitas ve(es" estas instru&0es ont8m .ug+ 5ue as impedem de terminar apropriadamente% -epeti&'o infinita $ provo ada por dois tipos de la&os de repeti&'o: 112 la&o de repeti&'o 5ue n'o ont$m uma ondi&'o de t$rminoD e 122 la&o de repeti&'o 5ue ont$m uma ondi&'o de t$rmino 5ue nun a $ atingida% Como e/emplos de la&os de repeti&'o infinitos do tipo 112" t8m)se:
while @1 Hin)"ruIJ+G

6mitir simultaneamente >e3pre++:o1? e >e3pre++:o0? torna a e/press'o *o! e5Mivalente a uma <ni a instru&'o ,-il& 1v% rela&'o entre *o! e ,-il& apresentada anteriormente2%
11

Captulo 1
for @ & & Hin)"ruIJ+G

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

2E

?stas duas instru&0es s'o e5uivalentes" mas a primeira delas $ mais utili(ada 1por 5uest'o de legibilidade2 para indi ar repeti&'o infinita inten ional% Como e/emplo de la&o de repeti&'o infinito do tipo 122 tem)se o seguinte:
for @i : 1& i H: 10& i>> 3 . . . i : 2&

Certamente a instru&'o *o! do <ltimo e/emplo ont$m um .ug por5ue ela ont$m um teste 1i H: 102 5ue sempre $ satisfeito" pois sempre 5ue esta ondi&'o $ testada i $ menor do 5ue 1F 1verifi5ue isso2% ,ortanto" a ondi&'o 1 impl-ita2 de parada 1i G 102 jamais ser# atingida% 1.=.; I$st!u78&s Co$#i"io$ais I$st!u78&s "o$#i"io$ais permitem o desvio do flu/o do programa para outras partes do programa dependendo da avalia&'o de um teste 1 ondi&'o2% ?ssas instru&0es ser'o e/aminadas a seguir% 1/@/4/1 In+truA:o if-else A prin ipal instru&'o ondi ional em C++ $ a instru&'o i*0&ls& 5ue tem a seguinte sinta/e: i* 1Ye/press'oZ2 Yinstru&'o1ZD &ls& Yinstru&'o2ZD

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

28

Como em outras linguagens" a parte &ls& $ op ional% A interpreta&'o do i* $ a seguinte: a e/press'o entre par8nteses $ avaliadaD se o resultado da mesma for diferente de (ero" >in+truA:o1? ser# e/e utadaD aso ontr#rio" se !ouver uma parte else" >in+truA:o2? ser# e/e utada% As instru&0es >in+truA:o1? e >in+truA:o2? podem" onforme visto anteriormente" ser substitu*das por se5M8n ias de instru&0es% ?/emplos de usos da instru&'o i*:
if @x A>>& else A--& B : x > A& if @x A>>& A--& << Ex*,u"a1a Nuan1+ x L+r 1iL*r*n"* 1* B*r+ << Ex*,u"a1a Nuan1+ x L+r i0ua- a B*r+ << Ex*,u"a1a )*m.r* << Ex*,u"a1a Nuan1+ x L+r 1iL*r*n"* 1* B*r+ << Ex*,u"a1a )*m.r*

As endenta&0es nos e/emplos a ima refletem rela&0es de depend8n ia entre instru&0es% ,or e/emplo" no primeiro aso a ima" as instru&0es A>> e A-- perten em ao i* e s'o endentadas om rela&'o a esta <ltima instru&'o" en5uanto 5ue a instru&'o B : x > A $ independente do i* e $ es rita no mesmo n*vel desta instru&'o% ?ndenta&'o serve o <ni o propsito de mel!orar a legibilidade do programa e n'o fa( a menor diferen&a para o ompilador% ,ara ilustrar este ponto" supon!a" por e/emplo" 5ue vo 8 deseja e/e utar as instru&0es >in+truA:o1? e >in+truA:o2? apenas 5uando x $ diferente de (ero na instru&'o a seguir:
if @x Hin)"ruIJ+1G& Hin)"ruIJ+2G& << Ex*,u"a1a Nuan1+ x L+r 1iL*r*n"* 1* B*r+ << Ex*,u"a1a )*m.r*

Apesar de a endenta&'o indi ar uma 1ilusria2 depend8n ia de >in+truA:o2? om o i*" na realidade esta instru&'o ser# sempre e/e utada" independentemente do valor de x% ,ara e/e utar ambas as instru&0es a ima 5uando x $ diferente de (ero" vo 8 teria 5ue junt#)las numa se5M8n ia de instru&0es omo:
if @x 3 Hin)"ruIJ+1G& Hin)"ruIJ+2G& 9

=a se&'o anterior" !amou)se a aten&'o para o perigo representado pela tro a" por engano" do operador rela ional de igualdade == pelo operador de atribui&'o =% Considere" agora" o seguinte e/emplo on reto:
int x : 0&

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

29

if

@x : 10 A >: 1&

<< E)"a in)"ruIJ+ )*rK )*m.r* *x*,u"a1a

A instru&'o a ima ont$m om erte(a um .ug" pois" omo a e/press'o x : 10 resulta sempre em 1F 1por 5ueX2" a instru&'o A >: 1 ser# sempre e/e utada% 1Se esta fosse realmente a inten&'o do programador" n'o faria sentido es rever uma instru&'o i*`2 9nstru&0es i* podem ser anin!adas de modo a representar desvios m<ltiplos% 4ma instru&'o i* $ anin!ada 5uando a instru&'o seguindo o i* ou a instru&'o seguindo o &ls& tamb$m $ uma instru&'o i*% ,or e/emplo" a instru&'o a seguir $ uma instru&'o i* anin!ada:
int a$ C$ . . . if @a H C if @a x : else x : else if x : C& else x : ,& ,$ x&

H , a& ,& @C H ,

A e/e u&'o da instru&'o i* anin!ada do e/emplo a ima atribuir# a x o menor valor entre os n<meros a" C" e , 1 onven&a)se de 5ue realmente entende isto`2% =ote 5ue 5uando um i* segue imediatamente um &ls&" olo a)se o i* na mesma lin!a do &ls& 1i%e%" n'o !# endenta&'o omo seria o aso se a instru&'o seguindo o &ls& fosse de outro tipo 5ue n'o um i*2% 6bviamente" isto n'o $ obrigatrio" mas mel!ora a legibilidade de instru&0es i* anin!adas% 4m fato importante em instru&0es anin!adas" e 5ue a arreta algumas ve(es em erro de programa&'o" $ o problema de asamento de ada &ls& om o respe tivo i*% ?spe ifi amente" no <ltimo e/emplo a ima" o primeiro &ls& asa om o segundo i*D o segundo &ls& asa om o primeiro i*D e o ter eiro &ls& asa om o ter eiro i* 1es rito omo &ls& i*2% ?m geral" deve)se adotar a seguinte regra de asamento: Um else est sempre associado ao if mais prximo que no tenha ainda um else associado. A regra a ima dei/a de ser v#lida se o i* mais pr/imo do &ls& estiver isolado entre !aves% ,or e/emplo" na primeira das instru&0es a seguir" o &ls& refere)se ao segundo i*" en5uanto 5ue na segunda instru&'o" o &ls& refere)se ao primeiro i*:

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>F

if @x if @A A >: x& else x >: A&

<< Ex*,u"a1a Nuan1+ x * A )J+ amC+) 1iL*r*n"*) 1* 0 << Ex*,u"a1a Nuan1+ x S 1iL*r*n"* 1* 0 * A S i0ua- a 0

if @x 3 if @A A >: x& 9 << Ex*,u"a1a Nuan1+ x * A )J+ amC+) 1iL*r*n"*) 1* 0 else x >: A& << Ex*,u"a1a Nuan1+ x S i0ua- a 0& << in1*.*n1*n"*m*n"* 1+ 'a-+r 1* A

A segunda instru&'o a ima tamb$m poderia ser es rita olo ando)se uma instru&'o va(ia 1i%e%" JDL2 num &ls& perten ente ao segundo i*:
if @x if @A A >: x& else & << (n)"ruIJ+ 'aBia else x >: A& << Ex*,u"a1a Nuan1+ x S i0ua- a B*r+

Bembre)se 5ue $ sempre boa pr#ti a de programa&'o indi ar por meio de oment#rios 5uando uma instru&'o va(ia est# sendo deliberadamente utili(ada" omo no <ltimo e/emplo% 6bserve ainda 5ue a olo a&'o do &ls& no mesmo n*vel de endenta&'o de seu i* asso iado" omo nos e/emplos a ima" ajuda a identifi ar poss*veis asamentos erraneos entre &ls&s e i*s% 1/@/4/2 "perador Condi-ional 6 operador ondi ional $ o <ni o operador t&!$<!io da linguagem C++ e" devido K sua semel!an&a om uma instru&'o ondi ional" ele ser# apresentado a5ui% 6 operador ondi ional $ representado pelos s*mbolos ? e :" e apare e no seguinte formato:
x T A R B

6 primeiro operando 1x2 representa uma e/press'o ondi ional 1i%e%" um teste2" en5uanto 5ue o segundo e o ter eiro operandos representam o valor final da e/press'o" sendo 5ue apenas um destes valores ser# es ol!ido" de a ordo om a avalia&'o do teste% Rais espe ifi amente" o resultado da e/press'o a ima ser# A 5uando x for diferente de (ero" e B 5uando x for (ero% 6 segundo e o ter eiro operandos podem ser de 5uais5uer

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>1

tipos" mas se estes forem de tipos diferentes !aver# onvers'o impl* ita de a ordo om as regras vistas anteriormente% 6 operador ondi ional representa uma abrevia&'o para instru&0es i*0&ls& de um formato espe *fi o" omo mostrado no e/emplo a seguir:
if @x U : A& else U : B&

A instru&'o i* do e/emplo a ima pode ser substitu*da por:


U : x T A R B&

Assim omo os operadores FF e VV" a ordem de avalia&'o de operandos do operador ondi ional $ bem definida: o primeiro operando $ +empre avaliado em primeiro lugar" em seguida $ avaliado o segundo ou o ter eiro operando" de a ordo om o resultado da a avalia&'o do primeiro operando% A pre ed8n ia do operador ondi ional $ maior apenas do 5ue a dos operadores de atribui&'o e do operador J"L 1ainda n'o visto2" e sua asso iatividade $ da direita para a es5uerda% ?ste operador $ algumas ve(es dif* il de ser lido e" portanto deve ser utili(ado om par imania% ?/istem situa&0es" entretanto" em 5ue ele $ bastante pr#ti o% 1/@/4/0 In+truA:o switch A instru&'o s,it"- $ uma instru&'o de s&l&7:o 'Vltipla an#loga K instru&'o "as& do ,as al% Quando e/istem muitas ramifi a&0es a serem seguidas num tre !o de um programa" o uso de instru&0es i* anin!adas tornam estas ramifi a&0es dif* eis de serem lidas% ?m algumas destas situa&0es" o uso de instru&0es s,it"- n'o apenas mel!ora a legibilidade omo tamb$m a efi i8n ia do programa% 9nfeli(mente" nem sempre uma instru&'o s,it"- pode substituir instru&0es i* anin!adas% A instru&'o s,it"- permite 5ue amin!os m<ltiplos sejam es ol!idos om base no valor de uma e/press'o% A sinta/e desta instru&'o $: s,it"- 1Ye/press'oZ2 ] "as& Ye/press'o onstante 1Z : Yinstru&'o 1Z "as& Ye/press'o onstante 2Z : Yinstru&'o 2Z % : "as& Ye/press'o onstante =Z : Yinstru&'o =Z #&*ault : Yinstru&'o +Z ^

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>2

A e/press'o 5ue segue imediatamente s,it"- deve ser uma e/press'o 5ue avalie para um inteiro 1por e/emplo" "-a!" i$t" lo$%2D esta e/press'o n'o pode resultar em *loat" por e/emplo% A instru&'o s,it"- $ interpretada da seguinte maneira: >e3pre++:o? $ avaliada e" se ela for igual a alguma e/press'o onstante 1seguindo ada "as&2" todas as instru&0es 5ue seguem esta e/press'o ser'o e/e utadas% Se >e3pre++:o? n'o for igual a nen!uma instru&'o onstante seguindo um "as& e !ouver uma parte #&*ault" 5ue $ op ional" a instru&'o seguindo esta parte ser# e/e utada% 4ma diferen&a importante entre a instru&'o s,it"- de C++ a instru&'o "as& de ,as al $ 5ue" na instru&'o s,it"-" todas as instru&0es seguindo o "as& sele ionado s'o e/e utadas" mesmo 5ue algumas destas instru&0es fa&am parte de um outro "as&% ?ste omportamento $ evitado 1e usualmente $ o 5ue se deseja2 atrav$s do uso das estruturas de ontrole 1desvio in ondi ional2 .!&aW" %oto ou !&tu!$% 4sualmente" a instru&'o .!&aW $ utili(ada para fa(er om 5ue a instru&'o s,it"- seja en errada e o ontrole passe para a instru&'o seguinte a esta instru&'o% ,ortanto" na grande maioria das ve(es deve)se utili(ar um .!&aW no final de ada instru&'o 1ou se5M8n ia de instru&0es2 seguindo ada "as&% ,or e/emplo"
char m*u7ara,"*r*& . R switch @m*u7ara,"*r* 3 case 'A'R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) r*L*r*n"*) << W +.IJ+ A break & case 'B'R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) r*L*r*n"*) << W +.IJ+ B break & case '7>>'R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) r*L*r*n"*) << W +.IJ+ 7 break & default R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) r*L*r*n"*) << W +.IJ+ 1*Lau-" break & 9

=o e/emplo a ima" e/iste a possibilidade de e/e u&'o de 5uatro se5M8n ias de instru&0es referentes ao valor orrentemente assumido pela vari#vel m*u7ara,"*r* : uma para ada um dos valores 'AO" 'B' e '7>>'" e a <ltima para 5uando o valor de m*u7ara,"*r* for diferente desses valores 1representado pela parte #&*ault2% =ote 5ue o .!&aW seguindo a se5M8n ia de instru&0es asso iada a #&*ault n'o $ realmente ne ess#rio pois n'o e/iste mais nen!uma instru&'o em seguida dentro do s,it"-D entretanto" o uso deste .!&aW onstitui boa pr#ti a de programa&'o% Quando mais de uma op&'o "as& num s,it"- orresponde a uma mesma instru&'o" pode)se olo ar estas op&0es juntas e seguidas pela instru&'o omum% ,or e/emplo:
switch @m*u7ara,"*r* 3

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>>

case 'a' R case 'A' R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) << r*L*r*n"*) W +.IJ+ a +u A break& case 'C' R case 'B' R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) << r*L*r*n"*) W +.IJ+ C +u B break& case ',' R case '7>>' R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) << r*L*r*n"*) W +.IJ+ , +u 7 break& default R << E),r*'a aNui uma )*NOPn,ia 1* in)"ruIQ*) << r*L*r*n"*) W +.IJ+ 1*Lau-" break& 9

1.=.= D&s+ios I$"o$#i"io$ais D&s+ios i$"o$#i"io$ais permitem o desvio do flu/o do programa para outras partes do programa independentemente da avalia&'o de 5ual5uer ondi&'o 1 omo nos desvios ondi ionais vistos antes2% ?ssas instru&0es ser'o e/aminadas a seguir12% 1/@/@/1 In+truA:o break A instru&'o .!&aW j# foi apresentada anteriormente omo um meio de impedir a passagem de uma instru&'o referente a um "as& para outras instru&0es perten entes a outros "as&s de uma instru&'o s,it"-% ,ode)se" entretanto" interpretar o omportamento de .!&aW mais generi amente omo uma forma de ausar o t$rmino prematuro de uma estrutura de ontrole% A instru&'o .!&aW pode tamb$m ser utili(ada em estruturas de repeti&'o e esta segunda interpreta&'o determina seu omportamento% ,or e/emplo:
while @x 3 . R if @A break& . R 9

12

C!amadas e retornos de fun&0es s'o tamb$m onstru&0es ser'o e/aminadas mais adiante%

onsiderados desvios in ondi ionais% ?stas

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>A

=o e/emplo a ima" o la&o ,-il& terminar# imediatamente aps a e/e u&'o da instru&'o .!&aW% 6 uso de desvios in ondi ionais omo .!&aW pode tornar os programas dif* eis de serem lidos% ,ortanto" estes desvios devem ser usados om autela% 4sualmente" sempre e/iste uma maneira mais elegante de se es rever um tre !o de programa sem o uso de .!&aW% 4ma e/ e&'o a esta regra $ o uso de .!&aW em instru&0es s,it"-" onforme visto a ima% 1/@/@/2 In+truA:o continue Como .!&aW" a instru&'o "o$ti$u& provo a desvios in ondi ionais em la&os de repeti&'o% ?ntretanto" diferentemente do .!&aW" "o$ti$u& n'o provo a o t$rmino do la&o" mas sim o retorno ao topo do mesmo% ,ortanto" esta instru&'o $ <til 5uando se deseja desviar um tre !o do orpo de um la&o por alguma ra('o% ,or e/emplo:
while @x 3 . R if @A continue& . . . << E))a) in)"ruIQ*) nJ+ )J+ *x*,u"a1a) Nuan1+ A 0 9

=o <ltimo e/emplo" aps a e/e u&'o de "o$ti$u&" o ontrole do programa retorna ao topo da instru&'o ,-il& 1i%e%" o teste da ondi&'o x2% =esta situa&'o" as instru&0es 5ue seguem o "o$ti$u& 1indi adas por pontos" no e/emplo2 n'o ser'o e/e utadas% A mesma re omenda&'o feita anteriormente para a instru&'o .!&aW tamb$m vale a5ui: tente n'o utili(ar a instru&'o "o$ti$u&" pois seu uso tende a tornar o programa ileg*vel% 1/@/@/0 In+truA:o goto A instru&'o %oto $ uma instru&'o de desvio in ondi ional 5ue assume a seguinte forma: %oto YrtuloZD

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>G

onde >r8tulo? $ um identifi ador 5ue indi a a instru&'o para onde o flu/o do programa ser# desviado aps a e/e u&'o do %oto orrespondente% 6 rtulo" 5ue 1diferentemente de outras linguagens2 n'o pre isa ser de larado" deve pre eder a instru&'o rotulada e ser seguido por J:L% 9sto $ uma instru&'o rotulada deve apare er omo: YrtuloZ : Yinstru&'oZ

+eve)se observar 5ue duas instru&0es n'o podem possuir o mesmo rtulo" e 5ue uma instru&'o rotulada deve estar situada na mesma fun&'o 5ue o %oto 5ue a referen ia% ?m outras palavras" n'o se pode desviar de uma fun&'o para outra% 1.un&0es ser'o dis utidas mais adiante% A5ui" $ sufi iente entender 5ue fun&0es em C++ s'o e5uivalentes a pro edimentos e fun&0es em ,as al%2 6 uso abusivo da instru&'o %oto $ onsiderado uma m# pr#ti a de programa&'o e" por ausa disso" algumas linguagens 1por e/emplo" Mo#ula0(2 at$ mesmo e/ luem esta estrutura de ontrole% =a realidade" raramente esta instru&'o pre isa ser utili(ada em linguagens estruturadas omo C++ e n'o e/iste ondi&'o geral na 5ual o uso de %oto $ indi ado% ?ntretanto" e/istem algumas raras situa&0es aonde o uso do mesmo mel!ora a efi i8n ia e legibilidade do programa%

1.? Op&!a#o! /!%ula


6 operador v*rgula 1"2 $ um operador 5ue permite a avalia&'o de mais de uma e/press'o aonde uma <ni a e/press'o seria normalmente permitida% 6 resultado deste operador $ a e/press'o 1operando2 mais K direita% 6 operador v*rgula $ o operador de mais bai/a pre ed8n ia de toda a linguagem C++ e sua asso iatividade $ da es5uerda para a direita% Tamb$m" a ordem de avalia&'o de operandos do operador v*rgula $ espe ifi ada omo sendo da es5uerda para a direita% 6 uso deste operador muitas ve(es prejudi a a legibilidade do programa e seu uso deve ser evitado na maioria dos asos% 6 uso mais omum do operador v*rgula $ em e/press0es *o! 5uando se pre isa utili(ar mais de uma e/press'o no lugar de >e3pre++:o 1? ou >e3pre++:o 0? 1ver a ima es5uema sint#ti o da e/press'o *o!2% ,or e/emplo:
for @% : 10$ X : 1& % - X G 0& %--$ X>> 3 . R 9

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>I

?m situa&0es diferentes da e/emplifi ada a ima" $ mel!or evitar o uso do operador v*rgula e" ao inv$s disso" es rever as e/press0es omo instru&0es separadas%

1.H E$t!a#a & 1a#a O<si"a


C++ $ uma linguagem relativamente pe5uena 1i%e%" om pou as onstru&0es v#lidas2 por5ue parte de sua fun ionalidade est# ontida em .i.liot&"as 5ue residem fora da linguagem em si% ?stas bibliote as s'o divididas em grupos de *u$78&s" "lass&s e templates1> 5ue t8m alguma afinidade entre si% ,or e/emplo" e/istem grupos de fun&0es para entrada e sa*da" geren iamento de memria" opera&0es matem#ti as" et % Cada um destes grupos possui 1pelo menos2 dois ar5uivos: 112 um ar5uivo)objeto 5ue ont$m as implementa&0es das fun&0es ou lasses do grupo previamente ompiladas 1i%e%" prontas para serem e/e utadas2D 122 um ar5uivo)fonte" denominado de "a.&7al-o" 5ue ont$m defini !es parciais 1alus8&s2 leg*veis das fun&0es implementadas no ar5uivo)objeto 1A% ,ara utili(ar um grupo de fun&0es de bibliote a num programa" vo 8 deve in luir o ar5uivo de abe&al!o 5ue ont$m as alus0es das fun&0es om uma diretiva b i$"lu#& 1usualmente" no in* io do programa2 om um dos seguintes formatos:

bi$"lu#& Y>nome do ar5ui2o?

ou bi$"lu#& _>nome do ar5ui2o?

A diferen&a entre os dois formatos $ a forma omo o ompilador fa( a bus a do ar5uivo a ser in lu*do% 6 modo omo os ar5uivos s'o pro urados depende do ompilador bem omo do sistema opera ional utili(ados% 6 segundo formato $ mais geral do 5ue o primeiro no sentido de 5ue a bus a $ mais e/tensa" mas" em ompensa&'o" a bus a pode ser mais demorada% =o aso de in lus'o de ar5uivos de bibliote a" se a instala&'o do ompilador foi feita de a ordo om as re omenda&0es do fabri ante" n'o !aver# problema de lo ali(a&'o do ar5uivo om o primeiro formato a ima% Se n'o onseguir
1> 1A

?stes termos ser'o des ritos mais adiante% 4m ar5uivo de abe&al!o pode onter ainda outras oisas" tais omo defini&0es de tipos e onstantes%

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>E

in luir um ar5uivo om um dos formatos a ima" onsulte a do umenta&'o do ompilador para saber aonde 1i%e%" em 5ue diretrio2 estes ar5uivos podem ser lo ali(ados% Ar5uivos de abe&al!o normalmente t8m a e/tens'o .h 1o J!L vem de headerD i%e%" abe&al!o em ingl8s2% ?ntrada e sa*da n'o fa(em parte da linguagem C++ em si% As fun&0es respons#veis pelas opera&0es b#si as de entrada e sa*da em C++ est'o lo ali(adas num grupo de fun&0es de bibliote a denominado stdio 1este nome vem de Jstandard input"outputLD i%e%" JentradaSsa*da padr'oL2% ,ara utili(ar as fun&0es de bibliote a de entradaSsa*da vo 8 deve" portanto" in luir o abe&al!o 5ue ont$m as alus0es destas fun&0es" 5ue $ o ar5uivo )"1i+.h " atrav$s da diretiva:
Yinclude H)"1i+.hG

Quando en ontra uma diretiva bi$"lu#&" o pr$)pro essador 1G C++ a substitui pelo ar5uivo 5ue se deseja in luir% ,or e/emplo" 5uando a diretiva a ima $ pro essada" o onte<do do ar5uivo )"1i+.h $ olo ado no lo al do programa aonde se en ontra a diretiva% +esta maneira" 5uando o ompilador en ontrar uma refer8n ia 1i%e%" !amada2 a uma fun&'o ontida no ar5uivo )"1i+.h ele saber# 5ue se trata realmente de uma fun&'o% Se vo 8 n'o in luir o ar5uivo de abe&al!o para as fun&0es 5ue vo 8 deseja utili(ar em seu programa" 5ual5uer refer8n ia a estas fun&0es ser# tratada pelo ompilador omo" por e/emplo" identifi-ador n:o de-larado" visto 5ue elas nem fa(em parte da linguagem C++ em si nem vo 8 as de larou e/pli itamente% Apesar de ser poss*vel utili(ar todas as fun&0es en ontradas no mdulo )"1i+" isto n'o $ omum em C++% 9sto $" o uso destas $ onsiderado ultrapassado e" ao inv$s disso" re onmenda)se o uso dos operadores ZZ 1entrada2 e YY 1sa*da2 juntamente om os objetos1I "i$ 1stream padr'o de entrada2" "out 1stream padr'o de sa*da2 e "&!! 1stream padr'o de sa*da de erros2% Al$m de serem muito mais f# eis de utili(ar do 5ue as fun&0es en ontradas no mdulo )"1i+ " o uso desses operadores e objetos $ menos sens*vel a erros do 5ue as a5uelas fun&0es% ,or e/emplo" o uso desses operadores e objetos torna desne ess#rio o uso de strings de formata&'o% 1.H.1 E$t!a#a

,or en5uanto" n'o se preo upe em saber e/atamente o 5ue $ o pr-processador #: onsidere)o omo um programa 5ue prepara previamente um ar5uivo)fonte a ser em seguida pro essado pelo ompilador% 6 pr$)pro essador $ respons#vel" entre outras oisas" pelo pro essamento de diretivas% 1I 4m estudo mais ompleto de objetos e lasses de entrada e sa*da 1streams2 $ feito no Cap*tulo 8%
1G

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>8

A entrada de dados $ feita utili(ando o objeto "i$ em onjunto om o operador ZZ" denominado op&!a#o! #& &9t!a7:o" e da vari#vel 5ue se deseja 5ue re eba o valor introdu(ido% =o aso mais simples isto $ obtido da seguinte forma: "i$ ZZ >nome da 2ari<2el?

Quando o flu/o de e/e u&'o do programa atinge uma instru&'o deste tipo" a e/e u&'o $ interrompida e espera)se 5ue o usu#rio digite um valor ompat*vel om a vari#vel seguido de HE/8E4G 1ou H4E8U4/G 2% ?nt'o" o operador ZZ atribui o valor digitado K vari#vel e retorna omo valor da opera&'o o objeto "i$% ,or e/emplo" se um programa ont$m os tre !os abai/o:
unsigned long minhaVaria'*-&

cin GG minhaVaria'*-&

e o usu#rio digitar o ara tere 65 na e/e u&'o da instru&'o a ima" K vari#vel minhaVaria'*- ser# atribu*do o valor 65% 6 operador ZZ $ asso iativo K es5uerda% ?ste fato aliado ao fato de o operador ZZ retornar o operando da es5uerda 1"i$2 permite 5ue v#rias dados possam ser introdu(idos numa <ni a lin!a de instru&'o" omo" por e/emplo:
int i$ %& cin GG i GG %&

=este aso a <ltima e/press'o $ interpretada omo:


@@cin GG i GG % &

4ma vantagem do operador ZZ $ 5ue ele $ apa( de re on!e er o formato do operando da direita se estes forem de algum tipo primitivo da linguagem e" assim" torna)se desne ess#rio espe ifi #)lo 1ao ontr#rio do 5ue o orre om algumas fun&0es de entrada en ontrada em )"1i+ 5ue re5uerem 5ue se espe ifi5uem os formatos das vari#veis de entrada por meio de strings de forma&'o2% 6utra vantagem do operador ZZ 5ue ainda n'o $ aparente neste ponto $ 5ue este operador pode ser modifi ado 1por meio de overloading2 para re on!e er formatos de tipos de dados definidos pelo progrmador% 1.H.( 1a#a

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

>9

A sa*da de dados $ feita utili(ando o objeto "out em onjunto om o operador YY" denominado op&!a#o! #& i$s&!7:o" e da e/press'o 5ue se deseja imprimir no meio de sa*da padr'o% =o aso mais simples isto $ obtido da seguinte forma: "out YY >2ari<2el/-on+tante/e3pre++:o?

,or e/emplo:
cout HH Z2r+0ramar *m 7>> *' +"im+EZ&

resultaria na impress'o de Z2r+0ramar *m 7>> *' +"im+EZ no meio de sa*da padr'o% 6 operador de inser&'o resulta no operando da es5uerda 1 "out2 e $ asso iativo K es5uerda% ?stes fatos permitem 5ue o mesmo possa ser utili(ado para sa*da de v#rios dados numa mesma instru&'o% ,or e/emplo:
int x : 10& cout HH Z6 'a-+r 1* Z HH x HH Z a+ Nua1ra1+ *' Z HH x?x HH endl&

imprimiria no meio de sa*da:


6 'a-+r 1* 10 a+ Nua1ra1+ *' 100

6 identifi ador endl utili(ado no final da instru&'o $ um 'a$ipula#o! #& st!&a' e tem o mesmo efeito de '!n'D i%e%" ele fa( om 5ue se passe para a pr/ima lin!a no meio de impress'o% 1.H.6 1a#a #& E!!os A sa*da de erros $ feita utili(ando o objeto "&!! em onjunto om o operador YY j# visto na se&'o anterior% A sa*da de erros $ semel!ante K sa*da de dados no meio de sa*da padr'o% A <ni a diferen&a $ 5ue o meio de sa*da de erros pode n'o oin idir om a sa*da de dados padr'o

1.T Co'&$t<!ios
Coment#rios em C++ s'o 5uais5uer se5M8n ias de s*mbolos olo ada entre os s*mbolos #&li'ita#o!&s #& "o'&$t<!ios <? e ?< ou ome em om SS% 6 objetivo prin ipal de oment#rios $ o de e/pli ar o programa para outras pessoas e para vo 8 mesmo 5uando for l8)lo aps algum tempo% Coment#rios podem tamb$m ser utili(ados para teste e

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

AF

depura&'o de programas" onforme ser# analisado mais adiante% A seguir" ser'o apresentados alguns onsel!os sobre 5ua$#o" "o'o e ao$#& omentar a fim de larifi ar um programa% 6 mel!or momento para omentar um tre !o de um programa $ e/atamente 5uando este tre !o est# sendo es rito% 9sto apli a)se espe ialmente para a5ueles tre !os de programa ontendo tru5ues" inspira&0es moment3neas ou oisas do g8nero" 5ue o prprio programador ter# difi uldade em entender algum tempo depois% Alguns oment#rios pass*veis de serem es5ue idos" tal omo a data de in* io da es rita do programa" tamb$m devem ser a res entados no momento da es rita do programa% 6utros oment#rios podem ser a res entados 5uando o programa estiver pronto" embora o ideal ontinue sendo omentar todo o programa K medida em 5ue o mesmo $ es rito% Coment#rios devem ser laros e dirigidos para programadores om alguma e/peri8n ia na linguagem% ?les n'o t8m 5ue ser did#ti os omo alguns oment#rios apresentados a5ui e em outros te/to de ensino de programa&'o% ?stes oment#rios did#ti os s'o <teis nestes te/tos 5ue t8m e/atamente o objetivo de ensinar" mas oment#rios num programa real t8m o objetivo de e/pli ar o programa para programadores" e n'o o de ensinar um leigo na linguagem o 5ue est# sendo feito%

1.T A$ato'ia #& u' P!o%!a'a 1i'pl&s &' C++


4m programa simples" onsistindo de um <ni o ar5uivo" em C++ possuem o seguinte formato geral:
Yinclude Hi+)"r*m.hG

<< (n,-ua aNui +u"r+) arNui'+) 1* CiC-i+"*,a u"i-iBa1+) n+ .r+0rama << << (n,-ua aNui 1*,-araIQ*) 1* 'ariK'*i)$ ,+n)"an"*) * "i.+) Nu* )*rJ+ n*,*))Kri+) n+ )*u .r+0rama

int main@void 3 << (n,-ua aNui in)"ruIQ*) Nu* *x*,u"*m a) aIQ*) << n*,*))Kria) n+ )*u .r+0rama. << ()"+ S$ "ra1uBa aNui$ *m 7>>$ )*u a-0+ri"m+ return 0& << (nL+rma a+ )i)"*ma +.*ra,i+na- Nu* << + .r+0rama "*rmin+u n+rma-m*n"* 9

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

A1

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

A2

1.R E9&!""ios #& R&+is:o


1% Quais dos seguintes nomes n'o podem ser utili(ados omo identifi adores em C++X ?/pli5ue por 5ue% 1a2 varD 1b2 PA-D 1g2 double 1!2 P69+D 1 2 intD 1i2 voidD 1d2 caD 1j2 stru tD e2 acD 1l2 stru tureD 1f2 ;1FD 1m2 default

2% Seja a uma vari#vel do tipo "-a!% Supon!a 5ue o digo de ara teres ASC99 seja utili(ado% Que valor 1inteiro de imal2 ser# arma(enado em a aps a e/e u&'o de ada uma das seguintes instru&0es: 1a2 a : '['& 1b2 a : 9& 1 2 a : '9'& 1d2 a : '1' > '9'& 1Sugest'o: Consulte uma tabela do digo ASC99%2 >% +iga de 5ue tipo s'o as seguintes onstantes num$ri as: 1a2 10D 1b2 3.14D 1 2 2.5LD 1d2 1.6*10L D 1e2 0LD A% +es reva as propriedades de p!&"&#C$"ia e asso"iati+i#a#& de operadores% G% Sejam L uma vari#vel do tipo *loat" u uma vari#vel do tipo u$si%$&# i$t" i uma vari#vel do tipo i$t" , uma vari#vel do tipo si%$&# "-a!% Que valores ser'o atribu*dos a L" u" i e , aps a e/e u&'o de ada uma das seguintes instru&0es: 1a2 , : i : L : u : 23.5& 1b2 i : u : L : , : 435& 1 2 L : , : i : u : -10& 1Sugest'o: Po 8 ertamente pre isar# representar alguns n<meros omo se5M8n ias de bits para entender omo os mesmos ser'o interpretados% Supon!a 5ue n<meros negativos s'o representados em omplemento de dois%2 I% Assuma a e/ist8n ia das seguintes de lara&0es num programa em C++:
int float m : 5$ n : 4& x :2.5$ A : 1.0&

1f2 0%

Quais ser'o os valores das seguintes e/press0esX 1a2 m > n > x - AD 1b2 m > x - @n > A D 1 2 x - A > m > A < nD

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++ n > x - AD x?n > AD A > mD A -: m%

A>

1d2 m 1e2 m 1f2 n 1g2 x

>: <: =: >:

E% ?/pli5ue a diferen&a entre os operadores prefi/o e sufi/o de in remento% 8% 6 5ue efeito olateral de um operadorX 9% +adas as seguintes de lara&0es:
int % : 0$ m : 1$ n : -1&

Quais ser'o os resultados de avalia&'o das seguintes e/press0es em C++X 1a2 m>> - --%D 1b2 m >: >>%?2 D 1 2 m ? m>> % 16 resultado desta e/press'o $ dependente do ompiladorD apresente os dois resultados poss*veis%2 1F% ?/pli5ue por 5ue a instru&'o abai/o n'o $ port#vel 1apesar de ser a eit#vel em C+ +2:
% : @i > 1 ? @i : 1

11% Apli5ue par8nteses nas e/press0es abai/o 5ue indi5uem o modo ompilador C++ e/e utaria as mesmas: 1a2 a : C?, :: 2D 1b2 a : C FF x E: AD 1 2 a : C >: , > a%

omo um

12% +es reva a sinta/e 1i%e%" o formato2 e a sem3nti a 1i%e%" o fun ionamento2 das seguintes estruturas de ontrole de C++: 1a2 ,-il&D 1b2 #o0,-il&D 1 2 *o!% 1>% ,ara 5ue serve o uso de instru&0es .!&aW dentro de uma instru&'o s,it"-X

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

AA

1A% 1a2 Compare as instru&0es de ontrole .!&aW e "o$ti$u&% 1b2 +entro de 5ue estruturas de ontrole estas instru&0es podem ser in lu*dasX 1G% 1a2 +es reva o fun ionamento da instru&'o %oto% ,or 5ue usualmente o uso de %oto n'o $ in entivadoX 1I% -es reva o seguinte tre !o de programa sem utili(ar %oto" "o$ti$u&" ou .!&aW:
main@ 3 int char

num : 0& ,&

, : getchar@ & while @1 3 if @, :: '!n' break& if @isdigit@, continue& if @, :: 'a' goto )+ma/um*r+& .r+xim+7ara,"*rR , : getchar@ & goto Lina-;+La,+& )+ma/um*r+R num>>& goto .r+xim+7ara,"*r& Lina-;+La,+R & 9 << Fina- 1+ Uhi-* 9

1E% Quais s'o os <ni os operadores da linguagem C++ 5ue possuem uma ordem de avalia&'o de operandos definidaX

Captulo 1

IN !"#$%&" ' LIN($)(E* #E P!"(!)*)%&" C++

AG

1.1S E9&!""ios #& P!o%!a'a7:o


?,1%12 ?s reva um programa em C++ 5ue imprima em ve(es a frase: 2r+0ramar *m 7>> *' +"im+ % ?,1%22 1a2 4tili(e o operador siF&o* em onjunto om "out e YY para determinar e imprimir o n<mero de b@tes dos seguintes tipos de dados: 1i2 s-o!tD 1ii2 i$tD 1iii2 lo$%D 1iv2 #ou.l&D 1v2 lo$% #ou.l&% A sa*da deste programa deve ser algo omo: J6 "i.+ short +,u.a 4 CA"*) L% 1b2 Sabendo o n<mero de b@tes o upado pelos tipos s-o!t" i$t e lo$%" determine o intervalo de poss*veis valores dos tipos: 1i2 1ii2 1iii2 1iv2 1v2 1vi2 s-o!tD u$si%$&# s-o!tD i$tD u$si%$&# i$tD lo$% i$tD u$si%$&# lo$%D

?,1%>2 ?s reva um programa em C++ 5ue imprima as letras de A a # 1mai<s ulas2 e seus respe tivos valores de imais% ?,1%A2 ?s reva um programa em C++ 5ue re eba um n<mero inteiro omo entrada e determine se o mesmo $ par ou *mpar% 6 programa deve terminar 5uando um n<mero inteiro negativo for introdu(ido% A sa*da do programa deve ser algo omo: 6 num*r+ in"r+1uBi1+ *' .ar %

AE

Anda mungkin juga menyukai