spamsink: (Default)
[personal profile] spamsink

Сгодится в качестве простенькой для интервью.
Заполните пропуски так, чтобы программа печатала "1 0 1" (для непрограммистов, заглянувших под кат: это соответствует "истина ложь истина"):
#define A пропуск_1
#define B пропуск_2

main() {
        printf("%d %d %d\n",
        A < B,
        A+1 < B,
        A+2 < B);
}


Сколько вариантов решения можно предложить?

Upd: комментарии больше не скрываются. Хорошо видны два принципиально различных класса подходов к решению.

Date: 2011-04-12 09:19 pm (UTC)
From: [identity profile] ygam.livejournal.com
#define A 2147483646
#define B 2147483647

Date: 2011-04-12 09:25 pm (UTC)
From: [identity profile] kcmamu.livejournal.com
#define A 1,0,1,0
#define B 0 // doesn't matter

Date: 2011-04-12 09:42 pm (UTC)
From: [identity profile] rezkiy.livejournal.com
#define A 1, 0, 1); 1
#define B (1
Edited Date: 2011-04-13 12:38 am (UTC)

Date: 2011-04-12 10:24 pm (UTC)
From: [identity profile] rezkiy.livejournal.com
#define A (unsigned)-2
#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

работает.
Edited Date: 2011-04-13 12:46 am (UTC)

Date: 2011-04-12 10:33 pm (UTC)
From: [identity profile] rezkiy.livejournal.com
#define A __LINE__
#define B (__LINE__ -13)*(__LINE__ -13) * 1000

int main () {
printf("%d %d %d\n",
A < B,
A+1 < B, <-- эта строка 13я
A+2 < B);
}
Edited Date: 2011-04-13 12:37 am (UTC)

Date: 2011-04-12 11:09 pm (UTC)
From: [identity profile] lev.livejournal.com
INT_MAX-1
INT_MAX

Date: 2011-04-12 11:20 pm (UTC)
From: [identity profile] rezkiy.livejournal.com
#define A ((printf("1 0 1\n"), exit(0)), main())
#define B ((printf("1 0 1\n"), exit(0)), main())
Edited Date: 2011-04-13 12:37 am (UTC)

Date: 2011-04-12 11:59 pm (UTC)
From: [identity profile] http://users.livejournal.com/_windwalker_/
Вот за это C и не любят - когда int неявно приводится к логическому типу либо наоборот :)

Date: 2011-04-13 12:12 am (UTC)
From: [identity profile] vgramagin.livejournal.com
Эту задачу можно переформулировать под другой язык (скажем, Java) - или она целиком основана на синтаксисе C?

Date: 2011-04-13 12:29 am (UTC)
From: [identity profile] vgramagin.livejournal.com
Я не очень понимаю, что такое константное выражение - но если это что-то типа макроса от A, то

A = x%2
B = (x+1)%2

должно сработать

Date: 2011-04-13 12:34 am (UTC)
From: [identity profile] rezkiy.livejournal.com
#define A -1 + (1 << sizeof(int)*8-2) << 0
#define B (1 << sizeof(int)*8-2)
Edited Date: 2011-04-13 12:36 am (UTC)

Date: 2011-04-13 02:52 am (UTC)
From: [identity profile] 6zow.livejournal.com
#define A 1 << 29
#define B 1 << 30

Date: 2011-04-13 03:21 am (UTC)
From: [identity profile] rezkiy.livejournal.com
ну всяко больше чем два. -1, __LINE__, трюк с запятыми и вот этот, который учитывает что сначало сложение потом сдвиг.

Date: 2011-04-13 06:13 am (UTC)
From: [identity profile] rezkiy.livejournal.com
50%: либо встречу, либо не встречу.

:-)

Date: 2011-04-13 03:39 am (UTC)
vak: (Default)
From: [personal profile] vak
#define A ~0U-1
#define B ~0U

Еще два варианта: UL и ULL.

Date: 2011-04-13 06:04 am (UTC)
vak: (Default)
From: [personal profile] vak
Зато так нет привязки к размеру слова.
А ты в курсе, что существуют процессоры, на которых sizeof(1)==1?

Date: 2011-04-13 03:51 am (UTC)
From: [identity profile] yatur.livejournal.com

Если разрешить плюсы, то можно развернуться. Типа,

#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);
}

Date: 2011-04-13 03:52 am (UTC)
From: [identity profile] yatur.livejournal.com
Т.е, пардон, в операторе надо return x!=1;
Но идея, я думаю, ясно

Date: 2011-04-13 04:08 pm (UTC)
From: [identity profile] yatur.livejournal.com
Я понимаю. Но явно это оглашено не было :)

Date: 2011-04-13 04:29 am (UTC)
From: [identity profile] http://users.livejournal.com/_navi_/
не подсматривая в другие ответы:
#define A 0xfffffffeu
#define B 0xffffffffu
// Альтернативно:
// #define A 0x7ffffffe
// #define B 0x7fffffff

main() {
        printf("%d %d %d\n",
        A < B,
        A+1 < B,
        A+2 < B);
}
ну или можно в стиле Bobby Tables (я удивился, что gcc по этому поводу не ругнулся, но похоже это из-за того, что printf неявно объявлён):
#define A 0
#define B 1,0,1

main() {
        printf("%d %d %d\n",
        A < B,
        A+1 < B,
        A+2 < B);
}

Date: 2011-04-13 06:16 am (UTC)
From: [identity profile] rezkiy.livejournal.com
а что делать тем несчастным, которые сначала придумали математический, потом bobby tables, но про первый рассказали вторым?

Date: 2011-04-13 06:28 am (UTC)
From: [identity profile] rezkiy.livejournal.com
мне больше всего нравится использование __LINE___!

Date: 2011-04-13 06:54 am (UTC)
From: [identity profile] rezkiy.livejournal.com
У меня в рукаве есть __COUNTER__

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 4th, 2026 09:47 pm
Powered by Dreamwidth Studios