Valor não definido

Em computação (particularmente, em programação), valor não definido (ou valor indefinido ou undefined) é uma condição na qual uma expressão não contém um valor correto, apesar de ser sintaticamente correta. Um valor não definido não deve ser confundido com uma cadeia vazia, booliano "falso" ou outro valor "vazio" (mas definido). Dependendo da circunstância, a evaluação para um valor não definido pode levar à uma exceção ou comportamento indefinido, mas em algumas linguagens de programação valores não definidos podem ocorrer durante um curso normal, predizível, de execução de programa.

Linguagens dinamicamente tipadas usualmente tratam o valor undefined explicitamente quando possível. Por exemplo, Perl tem o undef, operador[1] o qual pode "atribuir" tal valor a uma variável. Em outros sistemas de tipo um valor undefined pode significar desconhecido, imprevisível, ou meramente uma falha de programa na tentativa da evaluação do valor. Tipos anuláveis possibilitam uma abordagem intermediária; veja abaixo.

Exemplos

editar

O valor de uma função parcial é indefinido quando o seu argumento está fora do domínio de definição. Isto inclui inúmeros casos aritméticos como divisão por zero, raíz quadrada or logarítmo de um número negativo, etc.; veja NaN.

Mesmo algumas expressões bem-definidas matematicamente como exp(100000) podem ser indefinidas em aritmética de ponto flutuante porque seu resultado é tão grande que não pode ser representado. Se uma implementação suporta ±∞, então este valor pode ser computado como +∞ (inf), todavia.

Um elemento de um array é indefinido quando seu índice está fora dos limites, assim como um lookup em um array associativo por uma chave que não está contida no mesmo.

Um argumento de uma função variádica, tal que não foi passada a ela, é indefinida dentro do corpo da função.

Uma variável que não foi inicializada, tem valor não definido (ou imprevisível) até ocorrer sua atribuição.

Dereferências de ponteiros nulos levam a valor indefinido e usualmente levantam uma exception immediamente.

Qualquer expressão bottom type é indefinida por definição, porque este tipo não contém valores.

O valor de uma função que nunca pára (por exemplo, em caso de falha do operador μ em uma função μ-recursiva) pode ser vista como indefinida também, mas apenas de um interesse teórico porque tais funções nunca retornam.

Tratamento

editar

Na linguagem Perl, a propriedade de definição de uma expressão pode ser verificada por um predicado defined(expr).[2] O uso do valor undefined em Perl é razoavelmente seguro, sendo equivalente ao falso em um contexto lógico (dentro de um ifetc.).

Em linguagens estaticamente tipadas como C(C++) não existe a noção específica de um valor indefinido em tempo de execução. Expressões aritmeticamente indefinidas invocam exceções e falham um programa, se não forem tratadas. Dado indefinido (significa, imprevisível) em C e linguagens similares podem aparecer em programas mal projetados ou como o resultado de uma falha não esperada, e representam um risco severo, particularmente ponteiros para dealocar memória e ponteiros nulos para arrays ou estruturas. Até uma tentativa de ler um valor, que um ponteiro lixo pode referenciar para, pode fazer um programa falhar.

Valor não definido e tipos anuláveis

editar

Um tipo de dado anulável reserva um valor especial null para representar representing o valor undefined, então o valor null se torna um tipo de valor; note que o valor undefined geralmente não o é. Diferentemente de linguagens dinamicamente tipadas, uma variável de tipo anulável (como implementada em C#) tem de ser inicializada antes de poder ser utilizada.[3]

Notação

editar

Em teoria da computabilidade, a indefinição de uma expressão é denotada por expr↑, e a sua definição por expr↓.

Referências

  1. «undef». Perl 5 documentation. 25 de setembro de 2009. Consultado em 26 de março de 2010 
  2. «defined». Perl 5 documentation. 25 de setembro de 2009. Consultado em 26 de março de 2010 
  3. «C# Nullable Numeric Data Types». C# Fundamentals tutorial. Consultado em 27 de março de 2010 

Ver também

editar