#include <stdio.h>
#include <math.h>
int main() {
int i;
for (i = 0; i <= 1; ++i) {
float a = (i ? floor : ceil) (10.5);
printf("%d: %f\n", i, a);
}
return 0;
}
Для С++ надо написать:
#include <stdio.h>
#include <cmath>
int main() {
int i;
typedef float (*f)(float);
for (i = 0; i <= 1; ++i) {
float a = (i ? (f)std::floor : (f)std::ceil) (10.5);
printf("%d: %f\n", i, a);
}
return 0;
}
или
#include <stdio.h>
#include <cmath>
int main() {
int i;
for (i = 0; i <= 1; ++i) {
float a = (i ? std::floorl : std::ceill) (10.5);
printf("%d: %f\n", i, a);
}
return 0;
}
Все программы выводят:
0: 11.000000
1: 10.000000
Странно, выглядит как отход от навязшей в зубах обратной совместимости с Сями. А почему собственно в С++ нужно так извращаться?
ОтветитьУдалитьbialix: ну а зачем писать проще, когда можно сложнее? =)
ОтветитьУдалитьА можно объяснение поведения оператора ?: в С?
ОтветитьУдалитьbialix, где вы видите извращение? Там ведь #include , значит, всё в namespace std, а не просто понакидано в глобальной области видимости. Сделайте как в C #include и всё будет совместимо.
ОтветитьУдалитьИ, кстати, плюсы никогда не обещали быть _полностью_ совместимыми с прародителем.
Nikita Marunyak, всё просто. Что floor, что ceil - это указатель на функцию. Это такой же тип, как int, и точно так же может использоваться, пусть даже и в тернарном операторе.
ОтветитьУдалитьДебильный blogspot съел самое интересное...
ОтветитьУдалитьТам, где #include в первом случае cmath, во втором - math.h
Могу предположить, что floor и ceil перегружены в С++, поэтому фактический указатель выявляется из типа параметра. А т.к. ( i ? floor : ceil ) не имеет такой подсказки, ничего и не заработает. Приводя же явно к флоату - подкаска опять на месте.
ОтветитьУдалить@Дарк, bialix: Да, дело именно в наличии нескольких перегруженных вариантов, и не ясно, какую взять.
ОтветитьУдалить@Nikita Marunya: ?: работает в С как и в С++. Вообще это весьма интересный оператор, так как он работает не только стадии выполнения, но и на стадии компиляции, например:
#define COMPILE_TIME_ASSERT(x) \
void __cta_proto__(int __cta_foo__[(x) ? 1 : -1])