Contents

Capítulo 9 - Erros Comuns em C


botões
botões Conteúdo Capítulo anterior Capítulo seguinte

Antes de vermos as características finais da linguagem C vamos apontar os erros mais comuns cometidos pelos programadores.


Tópicos

setas
setas Up

Atribuição (=) versus comparação (==)

Alguns dos erros descritos são cometidos com frequência pelos programadores que até aqui apenas estavam familiarizados com a linguagem Pascal.

Um erro comum e difícil de detetar 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 é sintaticamente correta 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) { ... };
setas
setas Up

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, exceto arrays, o programador deverá utilizar 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 */
  ...
setas
setas Up

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() */
  ...
setas
setas Up

Í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.

setas
setas Up

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).

setas
setas Up

O C é case sensitive

Os caracteres minúsculos e maiúsculos são sensíveis no C. As palavras-chave, têm de ser, por exemplo, escritas com caracteres minúsculos.

setas
setas Up

O ; termina as instruções

Todas as instruções deverão ser terminadas com ;, exceto a instrução composta, ou seja o ; é um terminador e não um separador de instruções como acontece no Pascal. O compilador deteta este erro.

setas
setas Up