Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Em princípio, você pode escrever os nomes de funções e variáveis em um programa, assim como os comentários, em qualquer idioma. C permite qualquer tipo de caractere Unicode em comentários, e você pode colocá-los em identificadores com um prefixo especial (veja ). No entanto, para permitir que programadores de todos os países compreendam e desenvolvam o programa, é melhor, nas circunstâncias atuais, escrever todos os identificadores e comentários em inglês.
O inglês é a língua comum dos programadores; em todos os países, os programadores geralmente aprendem inglês. Se os nomes e comentários em um programa forem escritos em inglês, a maioria dos programadores em Bangladesh, Bélgica, Bolívia, Brasil, Bulgária e Burundi poderá entendê-los. Em todos esses países, a maioria dos programadores fala inglês, ou pelo menos o lê, mas eles não leem os idiomas uns dos outros. Na Índia, com tantos idiomas, dois programadores podem não ter um idioma comum além do inglês.
Se você não se sente confiante em escrever em inglês, faça o melhor que puder e siga cada comentário em inglês com uma versão em um idioma que você escreve melhor; adicione uma nota no comentário pedindo a outros para traduzirem isso para o inglês. Alguém eventualmente fará isso.
A interface do usuário do programa é uma questão diferente. Não precisamos escolher um idioma para isso; é fácil suportar múltiplos idiomas e deixar cada usuário escolher o idioma para exibição do texto. Isso requer escrever o programa para suportar a localização de sua interface. (O pacote gettext
existe para dar suporte a isso; veja The GNU C Library no The GNU C Library Reference Manual.) Dessa forma, um esforço de tradução baseado em comunidade pode fornecer suporte para todos os idiomas que os usuários desejam usar.
Para começar a descrição completa da linguagem C, explicamos a sintaxe lexical e as unidades lexicais de código em C. As unidades lexicais de uma linguagem de programação são conhecidas como tokens. Este capítulo cobre todos os tokens de C, exceto constantes, que serão abordadas em um capítulo posterior (veja ). Um tipo essencial de token é o identificador (veja ), que é usado para nomes de qualquer tipo.
A sequência formada por uma barra invertida e um caractere de nova linha é completamente ignorada em qualquer lugar em um programa C. Isso torna possível dividir uma única linha de código-fonte em várias linhas no arquivo fonte. O GNU C tolera e ignora outros espaços em branco entre a barra invertida e a nova linha. Em particular, ele sempre ignora um caractere CR (carriage return) ali, caso algum editor de texto decida terminar a linha com a sequência CRLF.
O principal uso da continuação de linha em C é para definições de macro que seriam inconvenientemente longas para uma única linha (veja ).
É possível continuar um comentário de linha em outra linha com a sequência barra invertida-nova linha. Você pode colocar tal sequência no meio de um identificador, até mesmo numa palavra-chave, ou num operador. Você pode até dividir ‘/*’, ‘*/’, e ‘//’ em várias linhas com a sequência barra invertida-nova linha. Aqui está um exemplo feio:
Isso é equivalente a ‘/* */ foo += 10;
’.
Não faça essas coisas em programas reais, pois elas tornam o código difícil de ler.
Nota: Por questão de uso de certas ferramentas no código-fonte, é sensato terminar cada arquivo fonte com um caractere de nova linha que não seja precedido por uma barra invertida, para que ele realmente termine a última linha.
Aqui descrevemos a sintaxe lexical de operadores e de pontuação em C. Os operadores específicos de C e seus significados são apresentados em capítulos subsequentes.
A maioria dos operadores em C consiste em um ou dois caracteres que não podem ser usados em identificadores. Os caracteres usados para operadores em C são ‘!~^&|*/%+-=<>,.?:’.
Alguns operadores são de um único caractere. Por exemplo, ‘-’ é o operador de negação (com um operando) e o operador de subtração (com dois operandos).
Alguns operadores são de dois caracteres. Por exemplo, ‘++’ é o operador de incremento. O reconhecimento de operadores de múltiplos caracteres funciona agrupando tantos caracteres consecutivos quanto possível para constituir um operador.
Por exemplo, a sequência de caracteres ‘++’ é sempre interpretada como o operador de incremento; portanto, se quisermos escrever duas instâncias consecutivas do operador ‘+’, devemos separá-las com um espaço para que não se combinem como um único token. Aplicando a mesma regra, a+++++b
é sempre tokenizado como a++ ++ + b
, e não como a++ + ++b
, mesmo que a última forma pudesse fazer parte de um programa C válido, e a primeira não (já que a++
não é um lvalue e, portanto, não pode ser o operando de ++
).
Alguns operadores de C são palavras-chave em vez de caracteres especiais. Eles incluem sizeof
(veja ) e _Alignof
(veja ).
Os caracteres ‘;{}’ são usados para pontuação e agrupamento. O ponto e vírgula (‘;’) termina uma declaração. As chaves (‘{’ e ‘}’) iniciam e terminam um bloco no nível da declaração (veja ), e cercam o inicializador (veja ) para uma variável com múltiplos elementos ou campos (como arrays ou structs).
Colchetes (‘[’ e ‘]’) são usados para indexação de arrays, como em array[5]
.
Parênteses são usados em expressões para o aninhamento explícito de expressões (veja ), ao redor das declarações de parâmetros em uma declaração ou definição de função, e ao redor dos argumentos em uma chamada de função, como em printf("Foo %d\n", i)
(veja ). Vários tipos de declarações também usam parênteses como parte de sua sintaxe — por exemplo, declarações if
, declarações for
, declarações while
e declarações switch
. Veja e seções seguintes.
Parênteses também são necessários ao redor do operando das palavras-chave dos operadores sizeof
e _Alignof
quando o operando é um tipo de dado em vez de um valor. Veja .
Arquivos de código-fonte em GNU C são geralmente escritos utilizando-se o conjunto de caracteres ASCII, que foi definido na década de 1960 para o inglês. No entanto, eles também podem incluir caracteres Unicode representados na codificação de múltiplos bytes UTF-8. Isso possibilita a representação de letras acentuadas como ‘á’, assim como outros scripts, tais como árabe, chinês, cirílico, hebraico, japonês e coreano.
No código fonte C, caracteres não ASCII são válidos em comentários, em constantes de caracteres largos (veja ) e em strings constantes (veja ).
Outra maneira de especificar caracteres não ASCII em constantes (caracteres ou strings) e identificadores é com uma sequência de escape começando com barra invertida, especificando o caractere Unicode pretendido. (Veja .) Isso especifica caracteres não ASCII sem colocar um caractere não ASCII real no próprio arquivo de código-fonte.
C também aceita pares de caracteres chamados dígrafos para certos caracteres. Veja .
Em alguns sistemas obscuros, GNU C utiliza UTF-EBCDIC ao invés de UTF-8, mas não vale a pena explicar isso neste manual.
Um identificador (nome) em C é uma sequência de letras, dígitos ou '_' (caractere de sublinha ou underscore), que não começa com um dígito. A maioria dos compiladores também permite '$'. Um identificador pode ter o comprimento que você desejar; por exemplo,
Letras em identificadores são sensíveis a maiúsculas e minúsculas em C; assim, a
e A
são dois identificadores diferentes.
Identificadores em C são usados como nomes de variáveis, nomes de funções, nomes de typedef
, constantes de enumeração, tags de tipo, nomes de campo e rótulos. Certos identificadores em C são palavras-chave, o que significa que têm significados sintáticos específicos. Palavras-chave em C são palavras reservadas, o que significa que você não pode usá-las de outra forma. Por exemplo, você não pode definir uma variável ou função chamada return
ou if
.
Você também pode incluir outros caracteres, até mesmo caracteres não ASCII, em identificadores escrevendo seus nomes de caracteres Unicode, que começam com '\u' ou '\U', no nome do identificador. Veja . No entanto, geralmente é uma má ideia usar caracteres não ASCII em identificadores, e quando os nomes são escritos em inglês, nunca precisam de caracteres não ASCII. Veja Escreva Programas em Inglês!.
Como mencionado acima, é necessário (pelo menos um) espaço em branco para separar dois identificadores consecutivos ou para separar um identificador de uma constante numérica anterior ou seguinte.
Um comentário encapsula texto que não tem efeito na execução ou no significado do programa.
O propósito dos comentários é explicar o código para as pessoas que o leem. Escrever bons comentários para seu código é extremamente importante – eles devem fornecer informações sobre o contexto, que ajudem os programadores a entender as razões pelas quais o código foi escrito da maneira que está. Você, retornando ao código seis meses depois, precisará da ajuda desses comentários para lembrar por que o escreveu dessa forma.
Comentários desatualizados que se tornam incorretos são contraproducentes, então parte da responsabilidade do desenvolvedor de software é atualizar os comentários conforme necessário para corresponder às mudanças no código do programa.
C permite dois tipos de sintaxe de comentário, o estilo tradicional e o estilo C++. Um comentário tradicional em C começa com '/*' e termina com '*/'. Por exemplo,
Um comentário tradicional pode conter '/*', mas esses delimitadores não se aninham como pares. O primeiro '/*' termina o comentário independentemente de ele conter sequências '/*' ou não.
Um comentário de linha começa com '//' e termina no final da linha. Por exemplo,
Comentários de linha se aninham, na prática, porque o '//' dentro de um comentário de linha é parte desse comentário:
É seguro colocar comentários de linha dentro de comentários de bloco, ou vice-versa.
Mas tenha cuidado ao comentar uma extremidade de um comentário tradicional com um comentário de linha. O delimitador '/*' não inicia um comentário se ocorrer dentro de um comentário já iniciado.
Comentários não são reconhecidos dentro de strings constantes. "/* blah */"
é a string constante ‘/* blah */
’, não uma string vazia.
Um comentário é sintaticamente equivalente ao espaço em branco, então ele sempre separa tokens. Assim,
é equivalente a
mas um código limpo sempre usa espaço em branco real para separar o comentário visualmente do código ao redor.
O espaço em branco refere-se a caracteres que existem em um arquivo, mas aparecem em branco em uma impressão deste arquivo (ou tradicionalmente apareciam em branco, várias décadas atrás). A linguagem C exige espaço em branco para separar dois identificadores consecutivos ou para separar um identificador de uma constante numérica. Além disso, em algumas situações especiais descritas mais adiante, o espaço em branco é opcional; você pode usá-lo quando quiser, para tornar o código mais fácil de ler.
Espaço e tabulação (caractere "tab") no código C são tratados como caracteres de espaço em branco. Quebras de linha também são. Você pode representar uma quebra de linha com o caractere de nova linha (também chamado de linefeed ou LF), CR (carriage return), ou a sequência CRLF (dois caracteres: carriage return seguido de um caractere de nova linha).
O caractere de avanço de formulário (formfeed), Control-L, era tradicionalmente usado para dividir um arquivo em páginas. Ele ainda é usado dessa forma no código fonte, e as ferramentas que geram impressões agradáveis do código fonte ainda iniciam uma nova página após cada caractere de "formfeed". Dividir o código em páginas separadas por caracteres de avanço de formulário é uma boa maneira de dividi-lo em partes compreensíveis e mostrar a outros programadores onde começam e terminam.
O caractere de tabulação vertical, Control-K, era tradicionalmente usado para fazer a impressão avançar para a próxima seção de uma página. Não conhecemos nenhum motivo particular para usá-lo no código fonte, mas ele ainda é aceito como espaço em branco em C.
Comentários também são sintaticamente equivalentes ao espaço em branco.