A maior rede de estudos do Brasil

Grátis
105 pág.
apostila de programacao em C - USP

Pré-visualização | Página 5 de 24

eles são usados para fazer co-
mentários no meio do código. Você pode escrever o que quiser entre esses dois símbolos,
pois tudo que ali estiver será ignorado pelo compilador. A única coisa que você não pode
fazer é colocar um comentário dentro do outro:
/
 um Fomentirio /
 isto p um erro 
/ dentro do outro 
/
Existe também uma outra maneira de fazer comentários, que foi copiada da linguagem
C++: usam-se duas barras //, mas o comentário só vale até o ĕnal da linha. Essa segunda
Boas maneiras em C 17
maneira só foi ĕxada no padrãomais recente da linguagem (C99); se seu compilador estiver
operando no modo ANSI, ele não gostará desse segundo tipo de comentário.
/
 &omentirio estiOo &

 

 &omeoa Fom barra e asterisFo�

 termina Fom asterisFo e barra.

/
// &omentirio estiOo &��
// 
// &omeoa Fom duas barras�
// vaOe apenas atp o finaO da Oinha.
Tenho algumas palavrinhas a proferir sobre o uso dos comentários, mas postergarei
esse assunto para o próximo capítulo, quando tivermos visto um pouco mais de teoria.
1.5.2 Estrutura e estilo
Em C, praticamente todos os espaços, tabulações e quebras de linha supérĘuos — de agora
em diante, sempre que eu falar de espaços,⁴ entenda que tabulações e quebras de linha
também estão incluídas — são ignorados pelo compilador (exceto, é claro, em uma string).
Os programas abaixo são, perante as regras da linguagem, absolutamente equivalentes:
�inFOude �stdio.h!
int main��^printf��2Oi� maraviOhoso mundo da programaomo�?n���return ←↩
��`
�inFOude �stdio.h!
int main��
^
printf��2Oi� maraviOhoso mundo da programaomo�?n���
return ��
`
�inFOude �stdio.h!
int main�
�^
printf�
�2Oi� maraviOhoso mundo da programaomo�?n�
⁴Em inglês, há a expressão whitespace, que indica qualquer sequência de espaços, tabulações e quebras
de linha. Não conheço nenhuma expressão equivalente em português, então teremos de conviver com essa
ambiguidade.
18 Capítulo 1. Princípios básicos
��
return ��
`
Mas qual deles é mais fácil de ler? O segundo, não é? Embora o estilo especíĕco que
você irá usar possa variar de acordo com sua preferência, há alguns princípios gerais que
você deve procurar seguir ao escrever um programa:
• Escreva uma instrução (um comando) por linha. Quando for necessário, divida a
instrução em mais de uma linha para melhorar a legibilidade (você pode quebrar a
linha em qualquer lugar onde poderia colocar um espaço). Em algumas situações
também pode ser aceitável juntar duas instruções em uma linha só, mas não abuse
disso.
• Sempre que você tiver um bloco de comandos (algo delimitado por chaves), o con-
teúdo do bloco deve estar mais afastado da margem que o exterior do bloco. É isso
que chamamos de indentação; ela torna muito mais fácil a visualização da estrutura
do código e de onde os blocos se encaixam. Você também deve deixar com omesmo
recuo as linhas que pertencem ao mesmo bloco, senão acaba aparecendo uma falsa
noção de hierarquia (ou uma verdadeira noção de bagunça).
2Controle de fluxo
Com o pouco que aprendemos até agora, só é possível construir programas lineares, ou
seja, que só sabem fazer uma determinada sequência de operações, quaisquer que sejam os
dados fornecidos (ou outras condições). Na maioria dos programas, isso não é suĕciente; é
preciso que o programa saiba fazer decisões. A capacidade do computador de fazer decisões
é conhecida como controle de Ęuxo.
2.1 Desvios condicionais: if
Uma das estruturas mais simples de controle de Ęuxo é a construção if (se), que veriĕca se
uma certa condição é satisfeita, e executa um conjunto de comandos em caso aĕrmativo.
Em C, isso se escreve assim:
if �condição�
^
/
 Fomandos aTui 
/
`
O funcionamento dessa estrutura é simples. Quando a execução do programa atinge o
if, a condição é avaliada, e há duas saídas possíveis:
• se a condição for satisfeita, o programa executa os comandos colocados dentro do
par de chaves, e depois continua a executar os comandos fora do par de chaves;
• se a condição não for satisfeita, o programa simplesmente pula o que está entre chaves
e continua a executar os comandos após as chaves.
Para que isso tenha alguma utilidade, precisamos aprender como são escritas as tais
condições. Dentre as condições mais simples que podemos escrever estão as comparações
entre números. Elas são escritas com os operadores a seguir, denominados operadores re-
lacionais:
19
20 Capítulo 2. Controle de fluxo
Tabela 2.1: Operadores relacionais, para comparação entre números.
Operador Signiĕcado
� menor que
� menor que ou igual a
! maior que
! maior que ou igual a
 igual a (cuidado! são DOIS iguais!)
� diferente de
Do mesmo jeito que ocorre para os operadores matemáticos, não há nenhum grande
mistério nouso dos operadores relacionais. Por exemplo, a condição “a émenor do queb” é
escrita como a � b; a igualdade entre a e b pode ser veriĕcada pela expressão a b, com
DOIS iguais. Porém, uma condição composta como “x está entre a e b” (matematicamente,
a < x < b) não pode ser escrita como a � [ � b; a expressão até é sintaticamente válida,
mas seu resultado é completamente diferente do que você esperaria. O jeito certo de fazer
essa comparação será esclarecido daqui a pouco.
if �a b�
^
printf��2s n~meros smo iguais�?n���
`
Existe uma abreviaçãomuito útil que pode ser usada com a estrutura if (e também pode
ser usada com outros tipos de estruturas que veremos a seguir). Quando houver apenas
um comando dentro do bloco delimitado pelas chaves, você pode omitir as chaves. Assim,
poderíamos escrever o trecho acima de forma um pouco mais compacta:
if �a b�
printf��2s n~meros smo iguais�?n���
Reforço que você só pode fazer essa abreviação quando dentro do bloco houver apenas
um comando. Se você ĕzer isso quando houver mais de um comando, mesmo que estejam
todos namesma linha ou com amesma indentação, todos os comandos a partir do segundo
serão dados como externos ao bloco. Por exemplo, observe o código a seguir:
if �a � ��
printf��2 vaOor de $ nmo pode ser negativo�?n���
a �� /
 indentaomo enganosa� 
/
A terceira linha foi indentada de modo que pareça fazer parte do if; na verdade ela está
fora dele, e será executada em qualquer caso, seja a negativo ou não. Esse código é equiva-
lente a este outro a seguir; este sim dá a correta impressão da organização do programa.
if �a � b� ^
printf��$ p menor Tue %�?n���
`
a b�
Desvios condicionais: if 21
Outro erro comum é confundir o operador de comparação de igualdade, , com o
operador de atribuição, . O código a seguir é “gramaticalmente correto”, mas não faz o
que ele aparenta fazer:
if �a b�
printf��$ p iguaO a %�?n���
O que está acontecendo aqui? Copiamos o valor de b para a variável a; o comando de
atribuição a b é por simesmouma expressão, cujo valor é igual ao valor que foi atribuído.
Esse valor é, então, interpretado como se fosse o valor de uma condição — cobriremos
isso mais adiante, na seção 2.6; mas veja que, independentemente de quem ele é, esse valor
condicional não tem a ver com a relação entre a e b, pois ele só depende do valor da variável
b! Portanto, a conclusão de que a é igual a b a partir desse if está errada.
Esse é um dos vários erros que podem não ser detectados pelo compilador, pois o có-
digo, ainda que semanticamente incorreto, é sintaticamente válido; por causa disso, você
conseguirá compilar e executar seu programa, mas alguma parte dele exibirá algum com-
portamento inesperado. Portanto, muito cuidado ao fazer comparações de igualdade.
2.1.1 Condições alternativas: else
Suponha que você quer ler um número do teclado e imprimir umamensagem dizendo se o
número é par ou ímpar. Para veriĕcar se é par, podemos simplesmente ver se ele é divísivel
por 2, ou seja, ver se o resto da divisão por 2 é zero. Isso poderia ser feito assim:
�inFOude �stdio.h!
int main��
^
int num�
printf��'igite um n~mero: ���
sFanf���d�� 	num��
if �num � � ��
printf��2 n~mero p par.?n���
if �num � � � ��
printf��2 n~mero p tmpar.?n���
return