Capítulo 9 - Erros Comuns em C
Antes de vermos as características finais da linguagem C vamos
apontar os erros mais comuns cometidos pelos programadores principiantes.
Alguns dos erros descritos são cometidos muito comummente pelos
programadores que até aqui apenas estavam familiarizados com a linguagem
Pascal.
Tópicos
Atribuição (=) versus comparação
(==)
Um erro comum e difícil de detectar provém do facto de uma
atribuição ser considerada uma expressão em C e além
disso qualquer expressão ter um valor lógico (TRUE ou FALSE).
Assim a seguinte instrução é sintacticamente correcta
mas frequentemente não é isso o que o programador pretende:
if (a = b) { ... };
Na instrução de cima o valor de b
é atribuído a a e o
if é avaliado como verdadeiro
se esse valor for diferente de 0. O que geralmente se pretende numa instrução
como aquela será comparar o valor de a
com o valor de b:
if (a == b) { ... };
Passagem de endereço
Certas funções são escritas esperando um apontador
em alguns dos seus argumentos, como vimos no capítulo anterior.
É frequente o programador esquecer-se de fazer corresponder a esses
argumentos um endereço. Se esses argumentos forem apontadores para
qualquer tipo, excepto arrays, o programador deverá usar o operador
&, que fornece o endereço
de uma variável. Exemplo:
int k;
struct coord p1;
float f[100];
void fn1(int *i, struct coord *p, float *ar)
{ ... }
...
fn1(&k, &p1, f);
/* chamada à função fn1() - notar a passagem de um
array */
...
Falta do operador () na chamada de uma função
Quando se está habituado a programar em Pascal é frequente
o esquecimento dos parêntesis curvos na chamada de uma função
sem argumentos. Em C, todas as chamadas a funções
têm de incluir os parêntesis curvos:
void fn2(void)
{ ... }
...
fn2( ); /* chamada
à função fn2() */
...
Índices dos arrays
Não esquecer que em C os arrays multidimensionais se declaram e
usam sempre com as dimensões separadas:
[][]... para arrays multidimensionais.
Além disso um array declarado com n elementos em qualquer das
suas dimensões tem índices que se situam sempre entre
0 e n-1.
Arrays e apontadores
Não esquecer a grande identidade entre arrays e apontadores, mas
também algumas diferenças já discutidas no capítulo
anterior. É de notar que é comum tratar as strings como apontadores
para char (na realidade são arrays de char).
O C é case sensitive
Os caracteres minúsculos e maiúsculos são diferentes
no C, ao contrário do que sucede noutras linguagens. Nomeadamente
as palavras chave têm de ser escritas com caracteres minúsculos.
O ; termina
as instruções
Todas as instruções deverão ser terminadas com ;,
excepto a instrução composta, ou seja o ;
é um terminador e não um separador de instruções
como acontece no Pascal. No entanto, o compilador detecta facilmente este
erro.