Алиса пришла с утра на пары и сразу показала своим одногруппникам программу из пяти строк
- код выделить все
int main(void) {
#if true
return 1;
#endif
}
Она заявила, что эта программа умеет отличать язык С от языка С++. Если скомпилировать ее как программу на языке С, то она вернет 0. А если скомпилировать ее как программу на языке С++, то она вернет 1.
Боря в ответ лишь засмеялся: "Ну и глупая ж ты, Алиска! Не знаю, как там в C++, но в языке С нет никакого `true`. Поэтому программа твоя - неправильная с точки зрения языка С."
Вася тут же отвесил ему подзатыльник: "Сам ты глупый пещерный дикарь, Борька! В языке С аж с 1999 года наличествует и отдельный булевский тип, и `true` c `false`. Но и Алиска тоже - наивная мормышка. Ясно же, что и в С++, и в С `true` означает "истина". Поэтому эта программа никак не сможет "отличить С от С++" и всегда будет возвращать 1."
Тут вмешался Гена: "Вы все тупые, как пробки! Есть ли там `true`, нет ли там `true` - не важно. `true` - это в любом случае сущность уровня языка, уровня компилятора, а `#if` - директива препроцессора. Препроцессору никакое `true` не известно и известно никак быть не может."
Кто же из них прав?