Я давно наткнулся на интересный вопрос на форуме и хочу знать ответ.
Рассмотрим следующую функцию C:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
Это должно всегда возвращаться false
с тех пор var3 == 3000
. main
Функция выглядит следующим образом :
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
Так как f1()
должен всегда возвращаться false
, можно ожидать, что программа выведет на экран только одну ложь . Но после компиляции и запуска его, выполняются также отображаются:
$ gcc main.c f1.c -o test
$ ./test
false
executed
Это почему? Есть ли в этом коде неопределенное поведение?
Примечание: я скомпилировал это с gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
было бы упростить до int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- это лучше показало бы несоответствие.
void
?
true
и false
в K & R 1-е изд., поэтому таких проблем не было вообще. Это был просто 0 и ненулевой для истины и ложи. Не так ли? Я не знаю, были ли доступны прототипы в то время.
_Bool
типа, ни <stdbool.h>
заголовка.
f1()
в тот же файл, чтоmain()
и вы, вы получите некоторую странность: хотя в C ++ правильно использовать()
пустой список параметров, в C это используется для функции с еще не определенным списком параметров ( в основном он ожидает список параметров в стиле K & R после)
). Чтобы быть правильным C, вы должны изменить свой код наbool f1(void)
.