Цитата(ARV @ Mar 25 2013, 15:32)

XVR, вы, пожалуйста, сообщите ВЕСЬ размер кода, потому как даже под WinAVR в моем варианте ассемблерный листинг функций давал ВАШ результат, а вот общий размер, который включает в том числе подготовительные действия по вызову функций, оказался совсем иным.
А вот это странно. Если меняется
только вызов, то разницы в размере вообще быть не должно, т.к. соглашения о вызовах функций не зависит от их содержимого.
Сделал main с вызовом var1/var2 в отдельном файле:
Код
typedef char boo;
boo var1(boo x, boo y);
boo var2(boo x, boo y);
int main()
{
return var1(1,2);
}
Результат - размер exe 9114 байт вне зависимости от вызываемой функции. (gcc 4.7.2)
Разрезание функций var1 и var2 на 1 разных файла и линковка только с одним из них (что бы неиспользуемая функция вообще не попала в выход) дала - по 1му варианту (с && и ||) -9037 байт, по второму ( ^ ) - 9006
Помещение всех функций в один файл и добавление static к var1/var2 дала 8876 для обоих вариантов. Ассемблер последнего случая -
Код
main:
.LFB2:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
т.е. компилятор вообще все выкинул
Цитата
потому как даже под WinAVR в моем варианте ассемблерный листинг функций давал ВАШ результат,
А вот это непонятно, почему тогда конечный результат получился прямо противоположный?
Цитата
который включает в том числе подготовительные действия по вызову функций,
У функций одинаковый прототип, почему тогда отличаются 'подготовительные действия по вызову функций'?
Цитата
что касается взгляда на логику, то по-моему, двух мнений тут быть не может: операция ^ арифметическая битовая, операция ! -логическая. в одном выражении смешаны два вида операций.
Еще раз, медленно и печально - в С
НЕТ РАЗЛИЧИЯ между логическими и арифметическими операциями. И чем быстрее вы (или кто угодно) к этому привыкнет, тем будет лучше.
Цитата
мой вариант как раз и отражает суть булевой алгебры преобразования логических функций - помните это? в моем варианте записи все сделано как раз в строгом соответствии с этим, и ни один пункт стандарта Си не нарушен - два плюса против одного вашего

Это огромный минус - вы придумали себе идеальную модель мира и пытаетесь запихнуть в нее идеологию языка С, а она туда не лезет. Вместо того, что бы прочувствовать эту идеологию, вы заявляете, что все, что противоречит вашей модели мира является неправильным и противоречащим здравому смыслу, и объявляете это вне закона.
Представьте себе - лето, пляж, люди загорают и купаются. Тут на пляже появляется человек в строгом черном костюме и с портфелем, и начинает громко возмущаться, что народ совсем совесть потерял, и в таком людном общественном месте находятся в практически голом виде, что идет в разрез со всеми нормами поведения в приличном обществе. Ничего не напоминает?
Цитата
я бы мог сделать опрос, но в своей формулировке: какая из этих конструкций более соответствует здравому смыслу?
Сделайте, только не забудьте упомянуть, что это все же программа на С, а не абстрактная математическая запись
Цитата
я ведь не о Си пекусь, а том, как писать программы в соответствии со здравым смыслом,
У вас какой то не тот 'здравый смысл'.
Хотя я кажется догадываюсь откуда он взялся. Вы тут упоминали о том, что писали на Pascal'е. Ваша реакция типична для программиста недавно перешедшего с Pascal на С. В Pascal'е действительно логические выражения не являются полноценными выражениями, и используются исключительно в условных операторах. В С это не так, привыкайте, и не пытайтесь всех переучить с С на Pascal - это нереально
Я помню у нас на работе был один товарищь, которому пришлось пересесть с Pascal на С. Так у него сразу появился специальный хидер такого содержимого -
Код
#define begin {
#define end }
Но через несколько месяцев это прошло
Я еще помню свои собственные впечатления, когда перешел с Pascal на С, а потом пришлось один проект снова сделать в Pascal'е - было такое впечатление, что на меня надели смирительную рубашку и приковали цепью к компьютеру
Цитата
P.S. а что этоу вас за опкод какой-то странный в первом листинге второго варианта - rep? вроде как это префикс-повторитель, и тут он как бы неуместен...
Это ret с префиксом rep. Зачем тут префикс - один gcc знает