LINUX.ORG.RU
int avg(int a, int b)
{
    if (sign(a) != sign(b))
        return (a + b) / 2;
    else
        return a + (b - a) / 2;
}

Это идеал кода? Бугагагага...
anonymous
()
Больше всего в статье радует апломб автора, в милинноый раз открывающего нам америку. Оч интересно.
Burbaka ★★
()
Ответ на: комментарий от php-coder
>Да-да. Боян :) Но статья хорошая.

чем же она хорошая? очередной дежурный коммент;)? помню читал где то твою цитату "не понял что за прога, но автор молодец". ))) жжошь пых

anonymous
()
Дрянь статья. Бросил читать после совета использовать HTTP везде.
welkam ★★
()
Ответ на: комментарий от anonymous
> Это идеал кода? Бугагагага...

Михаил, перелогинтесь! / Анонимус, не позорь имя — напиши код лучше.

anonymous
()
Ответ на: комментарий от anonymous
>int avg(int a, int b) { if (sign(a) != sign(b)) return (a + b) / 2; else return a + (b - a) / 2; }

>Это идеал кода? Бугагагага...

Код как код... Откуда мы знаем, что имел ввиду автор, когда писал это.

yz ★
()
правильная статья, достойные люди сами дошли до этих выводов, за исключением виндузятников и жабистов, которые в линукс лезут со своим bloatware, особенно жабофилы, насуют везде бездумно xml-я, soap, и проч. херь, потом и их программа тормозит и жрет всю память еще ничего не делая.
anonymous
()
Ответ на: комментарий от anonymous
> Анонимус, не позорь имя — напиши код лучше.

Как два пальца...

int avg(int a, int b) { return a/2 + b/2 + a & b & 1; }

Но в большинстве случаев хватит (a+b)/2

anonymous
()
В принципе весь смысл статьи умещается в единственной фразе: "Почитайте The Art of UNIX Programming, поизучайте вообще UNIX"
shumer ★
()
>"Почитайте The Art of UNIX Programming, поизучайте вообще UNIX, если вы этого еще не делали, и погрузитесь в мир, в котором программирование является утонченным, интеллектуальным ремеслом, или даже искусством. Уроки, которые вы извлечете оттуда, помогут писать более вменяемый код даже под Windows, если у вас после этого еще будет охота возвращаться к этому стилю и программным интерфейсам, созданным скорее для роботов, чем для людей".
ttnl ★★★★★
()
Ответ на: комментарий от anonymous
ну да, как два пальца. Может, с тремя пальцами получиться ? :)

int avg1(int a, int b) { return a/2 + b/2 + a & b & 1; }
int avg2(int a, int b) { return a/2 + b/2 + (a & b & 1); }

#define sign(a) (a > 0 ? 1 : 0)

int avg3(int a, int b)
{
    if(sign(a) != sign(b))
        return (a + b) / 2;
    else
        return a + (b - a) / 2;
}

int main(int argc, char **argv)
{
    printf("%d\n", avg1(3, -5));
    printf("%d\n", avg2(3, -5));
    printf("%d\n", avg3(3, -5));

    return 0;
}

[alex:alex tmp]$ gcc -o 1 1.c
[alex:alex tmp]$ ./1
0
0
-1
alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov
версия 0.2:

-#define sign(a) (a > 0 ? 1 : 0)
+ #define sign(a) (a > 0 ? 1 : (a < 0 ? -1 : 0))
alex_custov ★★★★★
()
Ответ на: комментарий от anonymous
>Как два пальца...
>int avg(int a, int b) { return a/2 + b/2 + a & b & 1; }
>Но в большинстве случаев хватит (a+b)/2

А можно так?

int avg(int a, int b){
   long sum = a+b;
   return (int)sum/2;
}
ftor ★
()
Да ладно, нашел к чему придираться, подумаешь - переполнение не учли. Мне вчера, например, попался такой вот код:

if(a < 0 || a > max || a == 1 || a == 2)

а еще раньше видел вот такое:

if(a < 0 || a > 2)

а - в обоих случаях целое.

А вы говорите - переполнение :)

shumer ★
()
Автор статьи долпайоп. 10 строчек скрипта в котором навреняка заюзан rcp/scp стравнивать со с нуля написанным софтом (который еще надо посмотреть что за софт вообще) - это сравнение жопы с пальцем. Если так, то любой гоблин может установить на маздайку SSH и в 10-строчный cmd, сделать тоже самое. А то что сейчас в моде индусс-код, так этим никого не удивишь.

КГ/АМ

cathode ★
()
Ответ на: комментарий от cathode
>Если так, то любой гоблин может установить на маздайку SSH и в 10-строчный cmd, сделать тоже самое.

вот так и надо было сделать. На кой кер писать новую программу, если есть хорошо работающий scp?
anonymous
()
Ответ на: комментарий от ftor
> Объясни, я учусь )

Видимо, он имел в виду, что (по причине идиотских Цешных правил приведения целых) a+b справа переполнится, ничего не зная о левой части присваивания.

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous
>>Если так, то любой гоблин может установить на маздайку SSH и в 10-строчный cmd, сделать тоже самое.

> вот так и надо было сделать.

Гы! Ты когда-нибудь пробовал лить дивидишник посредством scp?

Мы не знаем всех тонкостей -- может, там какая левая сетка была, или требовалось нечто одновременно суперсекретное и инкрементальное?

Но вообще ИМХО статья интересная, хотя и спорная во многих местах...

Die-Hard ★★★★★
()
Ответ на: комментарий от ftor
> Объясни, я учусь )

в дополнение к тому, что каст к (long) нужно внутри выражения делать, в стандарте Си нет гарантии что sizeof(long) > sizeof(int). есть только гарантия что sizeof(long) >= sizeof(int)

dilmah ★★★★★
()
Ответ на: комментарий от dilmah
> в стандарте Си нет гарантии что sizeof(long) > sizeof(int).

О Боже!

Извиняюсь, я этого даже и не заметил! Я подумал про гнутый long long. А sizeof(long) на 32 битах обычно равен sizeof(int).

Die-Hard ★★★★★
()
Ответ на: комментарий от ftor
Во-первых стандарт не гарантирует, что sizeof(long) > sizeof(int), он всего лишь требует чтобы sizeof(long) >= sizeof(int). И на 32-битных машинах, как правило, sizeof(int)==sizeof(long).

Вторую причину уже озвучил оратор выше.

anonymous
()
Ответ на: комментарий от Die-Hard
> Видимо, автор имел в виду if(a < 0 && a > 2)

сорри, я неправильно написал, там было строгое неравенство:

if(a <= 0 || a >= 2)

shumer ★
()
>>В общем случае, программа - это функция, которая берет аргументы и возвращает некий результат; сама программа состоит из функций, каждая из которых решает некоторую часть задачи.

А side-effects? Хорошо жить в мире, где есть только сферические кони в вакууме.

Morgendorffer
()
Ответ на: комментарий от Morgendorffer
Сорри, не дочитал.

>>Но, опять же, мы упростим наше исследование тем, что назовем все это "побочными эффектами".

Да, ограничимся только рассмотрением сферических коней. Влиянием воздуха тоже пренебрежём. Так что можно считать, что они находятся в вакууме.

Узнаю коллегу.
Morgendorffer
()
Ответ на: комментарий от shumer
>> Видимо, автор имел в виду if(a < 0 && a > 2) > сорри, я неправильно написал, там было строгое неравенство: > if(a <= 0 || a >= 2)

Ты тупой? Что (a < 0 || a > 2), что (a <= 0 || a >= 2) - что тут неправильного???

anonymous
()
Ответ на: комментарий от anonymous
> Ты тупой? Что (a < 0 || a > 2), что (a <= 0 || a >= 2) - что тут неправильного???

Рискну предположить, что, т.к. а - целое, то автор предполагал, что нужно писать if (a != 1)...
SOmni ★★
()
Ответ на: комментарий от anonymous
> Вероятно в том, что вместо if (a <= 0 || a >= 2) {} проще было бы записать if (a != 1) {}

Но не факт, что потом было бы проще это читать. Как раз об этом и говорится в статье, на которую ссылается топикстартер - если с точки зрения изложения человеческим языком значимо то, что "а" входит в одно из двух множеств (от минус бесконечности по нуль включительно и от 2 до бесконечности), а не то, что оно не равно единице - то так и следует записывать.

anonymous
()
Ответ на: комментарий от anonymous
>автор - вендозадрот, помешанный на "технологиях" от MS

тролли, проследуйте, пожалуйста на выход

автор статьи давно уже фор ван пишет библиотеку ptypes - объектно-ориетированную обертку для юниксовых интерфейсов а если почитаешь его другие статьи, то поймешь, что он совсем не фанат винды

anonymous
()
Статья целиком высосана из пальца. Если он уж так начитался книжек и так боялся переполнения,
почему не написал просто

int avg(int a, int b)
{
return ((long long)a + b) / 2;
}

Вместо этого целую кучу костылей напридумывал...
Agent666
()
Ответ на: комментарий от Agent666
> Вместо этого целую кучу костылей напридумывал...

"Боги, дайте мне яду!"

Попробую пояснить:

Представь, что тебе нужна функция long long avg(long long a, long long b)

Так проблема понятна, надеюсь? :-)

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard
> Представь, что тебе нужна функция long long avg(long long a, long long b)
> Так проблема понятна, надеюсь? :-)

Не понятна

long long avg(long long a, long long b)
{
float res = ((float)a + b) * 0.5;
return (long long)res;
}

Agent666
()
Ответ на: комментарий от Die-Hard
Любой код, который при одинаковой функциональности сложнее, не является хорошим
(если, конечно, тут нет критичных требований к скорости выполнения; а его код ещё
и медленнее будет работать).

Это-то правило хорошего стиля автор явно подзабыл (и которое в книге Art of The Unix
Programming должно быть упомянуто). Нет, ну если вам, конечно, нравится изобретать
велосипеды с квадратными колёсами, то делайте так. Я против ничего не имею, лишь бы
мне с таким кодом работать не приходилось. А автор статьи пусть лучше физикой занимается.
Agent666
()
Ответ на: комментарий от Agent666
> а его код ещё и медленнее будет работать

В случае, если я использую float, а не long long.

Agent666
()
Ответ на: комментарий от Die-Hard
я все-таки продолжу агент666, если нужна функция long double avg(long doublea, long double b), что будешь делать?

а вообще, схб

anonymous
()
Ответ на: комментарий от Agent666
>Любой код, который при одинаковой функциональности сложнее, не является хорошим

Любой код, который не работает в не которых ситуациях, всегда хуже того, который работает всегда.

>А автор статьи пусть лучше физикой занимается.

Вот кто бы говорил! Учитывая что переводе long long -> float можно потерять точность, код становится более похожим на костыли, а решение - по типу "не хватает памяти? ну купи еще 4 гигабайта, или ты нищеброд?"

generatorglukoff ★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.