Как проверить число на чётность не чётность?

Статус
В этой теме нельзя размещать новые ответы.

Vladson

Сильнобухер
Автор оригинала: Sender
если писать все подробно и правильно, со всеми проверками и т.п., то код пухнет на глазах, и это очень мешает
А если писать как попало лишь бы работало то код получается кривой а иногда и дырявый
(не в данном конкретном случае, однако примеров таких куча)
 

Vladson

Сильнобухер
Crazy
Далеко за примером ходить не нужно, обсуждал как-то на одном форуме один чат, так он по отзывам просто супер-крут, но стоит его поставить на РНР-5.1.х как тут-же начинают выскакивать всякие ошибки, я как глянул код чуть не упал, смотрю первое-же сообщение об ошибке указывает на строку
Код:
if($profile_object == "")
Думаю догадаться какой тип они таким образом проверяют не сложно

Недавно оказывается выпустили новую версию а в ChangeLog написали что добавили поддержку РНР5 (а сразу писать грамотно видимо лень было)
 

Skubent

Новичок
А давно в php преобразования стали "неявные" ?
В документации четко описано, что и когда бывает false, остальное - true.

Обрати внимание (с)Crazy:
В документации сказано, что if не "ожидает boolean", а "expression is evaluated to its Boolean value".
 

Crazy

Developer
Skubent, объясни мне разницу в семантике следующих выражений, please:

1. "expression is evaluated to its Boolean value
2. Выполняется неявное преобразование выражения к типу Boolean.

По поводу "В документации четко описано, что и когда бывает false, остальное - true": ты уверен, что там сказано именно это?

Я до сих пор пребывал в уверенности, что там сказано, что true это true, а false это false. И что есть правила, по которым в условных выражениях значения других типов трактуются (т.е. неявно приводяься) как true или false. Впрочем, буду благодарен за цитату, подтверждающую твои слова.
 

Skubent

Новичок
Раздел документации Converting to boolean ссылается на Type Juggling.
Был неправ, всегда считал, что логика работы (в случае if'a) "это у нас булево выражение, посмотрим, чему оно равно", а не "это у нас булево выражение ? - нет - Приведем его к булевому".
 

phprus

Moderator
Команда форума
Crazy
phprus, ты не понял ни слова из того, о чем я говорил. Это видно по бреду, который ты несешь.
Если я не понял, то объясните мне в чем я не прав. Вы же вместо агрументированного ответа називайте мои аргументы бредом, несмотря на то что они в отличие от ваших аргументов гораздо более весомее так как строятся на мнении человека который создал язык С++ (похоже пришлось объяснить кто такой Бьерн Страуструп).

Нет, разумеется, кулхацкеры имеют право писать "типа оптимизированный" нечитабельный код только потому, что они кулхацкеры. Здесь других причин уже не нужно.
Суда по всему вы так и не потрудитесь аргументировать свои слова. Вам гораздо проще обозвать меня кулхацкером.

обрати внимание: "возможно", а не "следует".
А вам следует обратить внимание на: Так как IF просто проверяет численное значение выражения. А раз так то я считаю что код if (val%2) гораздо более понятный чем код if (val%2 != 0)

Кстати книги которые упомянул denver никогда не были учебниками.

Vladson
То что я был не прав в отношении работы оператора if в php я уже признал, только этого видими никто не заметил.

denver
В данном случае связка страуструп-керниган бьет только по Crazy так как в этой связке написано что if сразу проверяет числовое выражение без всяких преобразований к типу bool, которого в С нет вообще.
 

HraKK

Мудак
Команда форума
+1 Crazy.

Не стоит заниматься упрощением кода, там где это не требуется. Тем более если это может сказаться на стабильности. И никогда не доверяйте языку программирования, то что можете сделать сами.

в тоже время и phprus, прав. Но только в случии с СиСи плюс плюс. Там это имеет смысл, еще и потому что даст выйграшь в скорости.
 

phprus

Moderator
Команда форума
HraKK
То что в отношении PHP прав Crazy я признал еще в середине первой страницы темы.
 

Crazy

Developer
Автор оригинала: phprus
Если я не понял, то объясните мне в чем я не прав.
Перечитай мои сообщения и свои ответы и убедись, что ты зачастую путал, где я говорю о C, а где о PHP.

Вы же вместо агрументированного ответа називайте мои аргументы бредом
Бессмысленно выдвигать аргументы тому, кто их не читает и вместо этого отвечает на какие-то вымышленные, неясно откуда взявшиеся аргументы.

несмотря на то что они в отличие от ваших аргументов гораздо более весомее так как строятся на мнении человека который создал язык С++ (похоже пришлось объяснить кто такой Бьерн Страуструп).
Вот как раз пример такого твоего ответа на свобственные же измышления.

А вам следует обратить внимание на: Так как IF просто проверяет численное значение выражения. А раз так то я считаю что код if (val%2) гораздо более понятный чем код if (val%2 != 0)
Спасибо, я понял, что ты так считаешь. Я тебе верю.

Кстати книги которые упомянул denver никогда не были учебниками.
Правда? Учебник есть книга, предназначенная для изучения конкретного предмета. С нулевого уровня до базового овладения материалом. Означенные книги направлены на что-то другое? И на что же?

В данном случае связка страуструп-керниган бьет только по Crazy так как в этой связке написано что if сразу проверяет числовое выражение без всяких преобразований к типу bool, которого в С нет вообще.
Вот, кстати, еще пример споров с фантастическими доводами. Где ты увидел у меня утверждение о том, что в C есть тип bool? Напомню, ты отвечал вот на это сообщение:

$var % 2 дает числовой результат. if ожидает булевское выражение. В PHP встроено множество правил неявного молчаливого преобразования типов и одно из них здесь сработает.
Соответственно, как я уже сказал выше, попытки аргументированно спорить с тобой лишены смысла.
 

HraKK

Мудак
Команда форума
phprus
Я видел, читать умею)
Я высказал свое ИМХО почему он прав.
 

Crazy

Developer
Автор оригинала: HraKK
Там это имеет смысл, еще и потому что даст выйграшь в скорости.
Т.е. если я скомпилирую оба варианта полноценным компилятором (например, gcc со включенной оптимизацией кода), то я получу различную скорость? Ты это проверял?

Обращаю внимание: я даже не упоминаю о том, что даже при использовании самого тупого неоптимизирующего компилятора лишь в немногих случаях разницу удастся измерить. :)
 

HraKK

Мудак
Команда форума
Это да:) Понятно что компилятор это оптимизирует.
НО я говорю про то что в теории это работает быстрее. Не согласен?
 

whirlwind

TDD infected, paranoid
>Т.е. если я скомпилирую оба варианта полноценным компилятором (например, gcc со включенной оптимизацией кода), то я получу различную скорость? Ты это проверял?

Че вы спорите я не пойму. Возьмите, скомпилируйте да посмотрите

Код:
8:        int a = 11;
0040D688   mov         dword ptr [ebp-4],0Bh
9:        int b = 10;
0040D68F   mov         dword ptr [ebp-8],0Ah
10:       if ( a & 0x01 )
0040D696   mov         eax,dword ptr [ebp-4]
0040D699   and         eax,1
0040D69C   test        eax,eax
0040D69E   je          main+3Dh (0040d6ad)
11:           printf("1\n");
0040D6A0   push        offset string "1\n" (00422020)
0040D6A5   call        printf (00401070)
0040D6AA   add         esp,4
12:       if ( b % 10 != 0 )
0040D6AD   mov         eax,dword ptr [ebp-8]
0040D6B0   cdq
0040D6B1   mov         ecx,0Ah
0040D6B6   idiv        eax,ecx
0040D6B8   test        edx,edx
0040D6BA   je          main+59h (0040d6c9)
13:           printf("2\n");
нашли чего сравнивать C и PHP. Про PHP я вообще молчу, так как там действительно не имеет значения. А вот про остальное.... Фича в том, что любой переход это анализ флагового регистра. А % это еще и вычисление остатка. В общем то получаем что с & быстрее, а внутри if все равно используется булево значение независимо от языка. В зависимости от конструкции внутри if и размер получения флага для перехода (флаг = бит = логическое = булево) Я не знаю почему это компилятор (MSVC 60 + sp) настолько туп, что после and выполняет сравнение (в принципе после and можно сразу делать jz, jnz), но в принципе по отношению к компилируемым языкам использование логических операций всегда рекомендовано, если они заменяют арифметические. это написано в любой стоящей книге по C/CPP.
 

Crazy

Developer
А вот это, простите, откуда?

Код:
if ( b % 10 != 0 )
Мы вроде как про if ( b % 2 != 0 ) говорили, нет?
 

whirlwind

TDD infected, paranoid
сори, проглючил... но смысл не меняется

Код:
12:       if ( b % 2 != 0 )
0040D6AD   mov         eax,dword ptr [ebp-8]
0040D6B0   and         eax,80000001h
0040D6B5   jns         main+4Ch (0040d6bc)
0040D6B7   dec         eax
0040D6B8   or          eax,0FFFFFFFEh
0040D6BB   inc         eax
0040D6BC   test        eax,eax
0040D6BE   je          main+5Dh (0040d6cd)
ЗЫ/ логические операции всегда лучше компилируются потому что они более прозрачны для компилятора
 

StUV

Rotaredom
phprus
А раз так то я считаю что код if (val%2) гораздо более понятный чем код if (val%2 != 0)
к сожалению, большинство программистов думают обратное и, если бы кто-то читал страуструпа внимательнее, то убедился бы, что и страуструп придерживается отличного от вашего мнения...

опыт работы в большом коллективе и получение по рукам за такие "оптимизации" изменят ваше отношение к такому коду
 

phprus

Moderator
Команда форума
StUV
Кто вам сказал что запись if(x%2) вместо if(x%2 != 0) это оптимизация? Специально для тех кто так считает я дизассемблировал маленькую программку и вот какие выводы сделал:
1) При компиляции выражений if(x%2) и if(x%2 != 0) получается абсолютно одинаковый ассемблерный код.
Как говорится найдтие 0 отличий.
Код:
if (i%2)
mov         ecx,dword ptr [esp+4] 
and         ecx,80000001h 
jns         start+2Fh 
dec         ecx  
or          ecx,0FFFFFFFEh 
inc         ecx  
///
if (i%2 != 0)
mov         edx,dword ptr [esp+4] 
and         edx,80000001h 
jns         start+58h 
dec         edx  
or          edx,0FFFFFFFEh 
inc         edx
2) при использовании if(x&1) вместо if(x%2) мы экономим 5 ассемблерных инструкций. по этому с большой натяжкой это можно назвать оптимизацией.
Код:
if (i&1)
00401080  test        byte ptr [esp+4],1 

if (i&1 != 0)
0040109D  test        byte ptr [esp+4],1
Компилировал Microsoft Visual Studio .NET 2002

Если ктото не согласен с моими выводами то можите сами их проверить и убедится, что тут я прав.
 

StUV

Rotaredom
phprus
Кто вам сказал что запись if(x%2) вместо if(x%2 != 0) это оптимизация?
вы
код if (val%2) гораздо более понятный чем код if (val%2 != 0)
если не понятно - поясню: более читабельный код уменьшает время разработки - соответственно улучшение кода есть оптимизация процесса разработки

вот за такую оптимизацию - я бы не бил по рукам, а отрывал их...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху