Grátis
105 pág.

Denunciar
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