Программистская загадка
Apr. 12th, 2011 02:00 pmСгодится в качестве простенькой для интервью.
Заполните пропуски так, чтобы программа печатала "1 0 1" (для непрограммистов, заглянувших под кат: это соответствует "истина ложь истина"):
#define A пропуск_1
#define B пропуск_2
main() {
printf("%d %d %d\n",
A < B,
A+1 < B,
A+2 < B);
}Сколько вариантов решения можно предложить?
Upd: комментарии больше не скрываются. Хорошо видны два принципиально различных класса подходов к решению.
no subject
Date: 2011-04-12 09:19 pm (UTC)#define B 2147483647
no subject
Date: 2011-04-13 12:56 am (UTC)#define A -2
#define B ~0 // vs 0xFFFFFFFF
получается любопытнее.
no subject
Date: 2011-04-12 09:25 pm (UTC)#define B 0 // doesn't matter
no subject
Date: 2011-04-13 12:57 am (UTC)no subject
Date: 2011-04-12 09:42 pm (UTC)#define B (1
no subject
Date: 2011-04-12 10:24 pm (UTC)#define B (unsigned)-1
КОмпилятор может не ругнуться (а может и ругнуться, считаем, что int 32-битный)
#define A -2
#define B 0xFFFFFFFF
но я что-то не уверен в том, что это будет работать везде. Потому что
#define A -2
#define B ~0
не работает, а
#define A -2
#define B (unsigned)~0
работает.
no subject
Date: 2011-04-13 12:53 am (UTC)no subject
Date: 2011-04-12 10:33 pm (UTC)#define B (__LINE__ -13)*(__LINE__ -13) * 1000
int main () {
printf("%d %d %d\n",
A < B,
A+1 < B, <-- эта строка 13я
A+2 < B);
}
no subject
Date: 2011-04-12 11:09 pm (UTC)INT_MAX
no subject
Date: 2011-04-12 11:20 pm (UTC)#define B ((printf("1 0 1\n"), exit(0)), main())
no subject
Date: 2011-04-12 11:59 pm (UTC)no subject
Date: 2011-04-13 12:03 am (UTC)no subject
Date: 2011-04-13 12:12 am (UTC)no subject
Date: 2011-04-13 12:22 am (UTC)no subject
Date: 2011-04-13 12:29 am (UTC)A = x%2
B = (x+1)%2
должно сработать
no subject
Date: 2011-04-13 12:40 am (UTC)no subject
Date: 2011-04-13 12:34 am (UTC)#define B (1 << sizeof(int)*8-2)
no subject
Date: 2011-04-13 02:52 am (UTC)#define B 1 << 30
no subject
Date: 2011-04-13 02:55 am (UTC)no subject
Date: 2011-04-13 03:21 am (UTC)no subject
Date: 2011-04-13 05:11 am (UTC)no subject
Date: 2011-04-13 06:13 am (UTC):-)
no subject
Date: 2011-04-13 03:39 am (UTC)#define B ~0U
Еще два варианта: UL и ULL.
no subject
Date: 2011-04-13 05:14 am (UTC)Трюк, собственно, в том, что в Си константа, вылезающая за диапазон чисел со знаком, автоматически становится беззнаковой, даже без приписывания U в конце.
no subject
Date: 2011-04-13 06:04 am (UTC)А ты в курсе, что существуют процессоры, на которых sizeof(1)==1?
no subject
Date: 2011-04-13 06:20 am (UTC)no subject
Date: 2011-04-13 03:51 am (UTC)Если разрешить плюсы, то можно развернуться. Типа,
#define A 0 #define B C() class C {} int operator < (int x, C y) { return x==1; } main() { printf("%d %d %d\n", A < B, A+1 < B, A+2 < B); }no subject
Date: 2011-04-13 03:52 am (UTC)return x!=1;Но идея, я думаю, ясно
no subject
Date: 2011-04-13 06:18 am (UTC)no subject
Date: 2011-04-13 04:08 pm (UTC)no subject
Date: 2011-04-13 04:29 am (UTC)no subject
Date: 2011-04-13 05:19 am (UTC)no subject
Date: 2011-04-13 06:16 am (UTC)no subject
Date: 2011-04-13 06:18 am (UTC)no subject
Date: 2011-04-13 06:28 am (UTC)no subject
Date: 2011-04-13 06:31 am (UTC)no subject
Date: 2011-04-13 06:54 am (UTC)