Eu me deparei com uma pergunta interessante em um fórum há muito tempo e quero saber a resposta.
Considere a seguinte função C:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Isso sempre deve retornar false
desde então var3 == 3000
. A main
função fica assim:
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Como f1()
sempre deve retornar false
, seria de esperar que o programa imprimisse apenas um falso na tela. Mas depois de compilá-lo e executá-lo, executado também é exibido:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Por que é que? Esse código tem algum tipo de comportamento indefinido?
Nota: Eu compilei com gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
poderia ser simplificada para int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- este iria mostrar a discrepância melhor.
void
?
true
e false
na K&R 1st ed., portanto não havia tais problemas. Era apenas 0 e diferente de zero para verdadeiro e falso. Não é? Não sei se os protótipos estavam disponíveis naquele momento.
_Bool
tipo nem <stdbool.h>
cabeçalho.
f1()
para o mesmo arquivomain()
, obteria alguma estranheza: embora seja correto em C ++ usar()
para uma lista de parâmetros vazia, em C usado para uma função com uma lista de parâmetros ainda não definida ( basicamente espera uma lista de parâmetros no estilo K&R após o)
). Para estar correto C, você deve alterar seu código parabool f1(void)
.