C · Avançado · Português · Técnico
comportamento não especificado
Caso em que o padrão admite mais de um resultado válido sem exigir que o compilador documente qual escolheu, como a ordem de avaliação dos argumentos de uma função.
Onde usar
Surge em chamadas como a() + b(), onde a ordem de avaliação varia entre compiladores. O programa continua válido, ao contrário do indefinido, mas o resultado pode divergir.
Em código
#include <stdio.h>
int a(void) { puts("a"); return 1; }
int b(void) { puts("b"); return 2; }
int main(void) {
printf("%d\n", a() + b()); // a ou b antes?
}Exemplos
A ordem dos argumentos é comportamento não especificado, então não dependa dela.
Não é indefinido, só não especificado: cada compilador escolhe uma ordem.
Cuidado
Confundir com comportamento indefinido (o padrão não impõe nada) e com definido pela implementação (o compilador precisa documentar a escolha).
Sinônimos
unspecified behavior
Antônimos
comportamento definido