Я наткнувся на цікаве запитання на форумі давно і хочу знати відповідь.
Розглянемо наступну функцію 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)
.