Oberon space

General Category => Общий раздел => Тема начата: ilovb от Апрель 28, 2012, 07:50:02 am

Название: Больше или равно
Отправлено: ilovb от Апрель 28, 2012, 07:50:02 am
У меня есть один бзик. Я не люблю в коде операции "<=" и ">=". Всегда стараюсь выражать через отрицание.

например такое:
IF a <= 10 THEN
dosomething();
END;

пишу так:
IF ~(a > 10) THEN
dosomething();
END;

Т.е. я лучше воспринимаю, если явно написано "не больше"

Я один такой?
Название: Re: Больше или равно
Отправлено: Губанов Сергей Юрьевич от Апрель 28, 2012, 09:38:26 am
Если а целочисленная, то вместо a <= 10 я пишу a < 11.
Название: Re: Больше или равно
Отправлено: Romiras от Апрель 28, 2012, 10:44:04 am
Если нет рационального объяснения поведению, то наверно таки бзик.  ;)
Название: Re: Больше или равно
Отправлено: ilovb от Апрель 28, 2012, 11:24:53 am
Понятно что Фрейд  ;D

Мне просто интересно, это мой личный бзик, или это коллективное бессознательное...
Название: Re: Больше или равно
Отправлено: vlad от Апрель 28, 2012, 02:52:13 pm
Понятно что Фрейд  ;D

Мне просто интересно, это мой личный бзик, или это коллективное бессознательное...

Да, я тоже избегаю нестрогих неравенств. Правда до отрицания не довожу :)
Название: Re: Больше или равно
Отправлено: Geniepro от Апрель 30, 2012, 06:03:40 am
У меня есть один бзик. Я не люблю в коде операции "<=" и ">=". Всегда стараюсь выражать через отрицание.

Две операции вместо одной? о_О Смысл?
Название: Re: Больше или равно
Отправлено: ilovb от Апрель 30, 2012, 12:49:02 pm
Нету никакого смысла. Просто интуитивное неприятие "<=" и ">="

И как оказалось не только у меня :)
Название: Re: Больше или равно
Отправлено: Губанов Сергей Юрьевич от Май 02, 2012, 10:20:58 am
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.
Название: Re: Больше или равно
Отправлено: alexus от Май 02, 2012, 12:16:29 pm
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.
Если говорить о семействе процессоров x86, то там есть команды перехода по равенству, по неравенству, по "больше", по "меньше", по "больше или равно", по "меньше или равно". Если компилятор переводит текст программы в код без оптимизации, то... дополнительные команды будут. Дело в том, что результаты первого сравнения будут находиться в регистре флагов, инвертировать регистр флагов нельзя. Поэтому следующим ходом регистр флагов поместится в регистр (e/r)ax. Затем будет выполнена команда инвертирования регистра (e/r)ax. Результат снова поместится в регистр флагов, и только после этого можно сделать соответствующий условию переход.
Если же компилятор немножко "соображает", то он сам выполнит преобразования и готовую конструкцию подставит в код. В этом случае удлинения кода не будет.
Команды условных переходов:
Код Команда Описание
77 cb JA rel8 Короткий переход, если выше (CF=0 и ZF=0)
73 cb JAE rel8 Короткий переход, если выше или равно (CF=0)
72 cb JB rel8 Короткий переход, если ниже (CF=1)
76 cb JBE rel8 Короткий переход, если ниже или равно (CF=1 или ZF=1)
72 cb JC rel8 Короткий переход, если перенос (CF=1)
E3 cb JCXZ rel8 Короткий переход, если CX=0
E3 cb JECXZ rel8 Короткий переход, если ECX=0
74 cb JE rel8 Короткий переход, если равно (ZF=1)
74 cb JZ rel8 Короткий переход, если нуль (ZF=1)
7F cb JG rel8 Короткий переход, если больше (ZF=0 и SF=OF)
7D cb JGE rel8 Короткий переход, если больше или равно (SF=OF)
7C cb JL rel8 Короткий переход, если меньше (SF<>OF)
7E cb JLE rel8 Короткий переход, если меньше или равно (ZF=1 или SF<>OF)
76 cb JNA rel8 Короткий переход, если не выше (CF=1 или ZF=1)
72 cb JNAE rel8 Короткий переход, если не выше или равно (CF=1)
73 cb JNB rel8 Короткий переход, если не ниже (CF=0)
77 cb JNBE rel8 Короткий переход, если не ниже или равно (CF=0 и ZF=0)
73 cb JNC rel8 Короткий переход, если не перенос (CF=0)
75 cb JNE rel8 Короткий переход, если не равно (ZF=0)
7E cb JNG rel8 Короткий переход, если не больше (ZF=1 или SF<>OF)
7C cb JNGE rel8 Короткий переход, если не больше или равно (SF<>OF)
7D cb JNL rel8 Короткий переход, если не меньше (SF=OF)
7F cb JNLE rel8 Короткий переход, если не меньше или равно (ZF=0 и SF=OF)
71 cb JNO rel8 Короткий переход, если не переполнение (OF=0)
7B cb JNP rel8 Короткий переход, если нечетно (PF=0)
79 cb JNS rel8 Короткий переход, если положительно (SF=0)
75 cb JNZ rel8 Короткий переход, если не нуль (ZF=0)
70 cb JO rel8 Короткий переход, если переполнение (OF=1)
7A cb JP rel8 Короткий переход, если паритет (PF=1)
7A cb JPE rel8 Короткий переход, если четно (PF=1)
7B cb JPO rel8 Короткий переход, если нечетно (PF=0)
78 cb JS rel8 Короткий переход, если отрицательно (SF=1)
0F 87 cw/cd JA rel16/32 Ближний переход, если выше (CF=0 и ZF=0)
0F 83 cw/cd JAE rel16/32 Ближний переход, если выше или равно (CF=0)
0F 82 cw/cd JB rel16/32 Ближний переход, если ниже (CF=1)
0F 86 cw/cd JBE rel16/32 Ближний переход, если ниже или равно (CF=1 или ZF=1)
0F 82 cw/cd JC rel16/32 Ближний переход, если перенос (CF=1)
0F 84 cw/cd JE rel16/32 Ближний переход, если равно (ZF=1)
0F 84 cw/cd JZ rel16/32 Ближний переход, если нуль (ZF=1)
0F 8F cw/cd JG rel16/32 Ближний переход, если больше (ZF=0 и SF=OF)
0F 8D cw/cd JGE rel16/32 Ближний переход, если больше или равно (SF=OF)
0F 8C cw/cd JL rel16/32 Ближний переход, если меньше (SF<>OF)
0F 8E cw/cd JLE rel16/32 Ближний переход, если меньше или равно (ZF=1 или SF<>OF)
0F 86 cw/cd JNA rel16/32 Ближний переход, если не выше (CF=1 или ZF=1)
0F 82 cw/cd JNAE rel16/32 Ближний переход, если не выше или равно (CF=1)
0F 83 cw/cd JNB rel16/32 Ближний переход, если не ниже (CF=0)
0F 87 cw/cd JNBE rel16/32 Ближний переход, если не ниже или равно (CF=0 и ZF=0)
0F 83 cw/cd JNC rel16/32 Ближний переход, если не перенос (CF=0)
0F 85 cw/cd JNE rel16/32 Ближний переход, если не равно (ZF=0)
0F 8E cw/cd JNG rel16/32 Ближний переход, если не больше (ZF=1 или SF<>OF)
0F 8C cw/cd JNGE rel16/32 Ближний переход, если не больше или равно (SF<>OF)
0F 8D cw/cd JNL rel16/32 Ближний переход, если не меньше (SF=OF)
0F 8F cw/cd JNLE rel16/32 Ближний переход, если не меньше или равно (ZF=0 и SF=OF)
0F 81 cw/cd JNO rel16/32 Ближний переход, если не переполнение (OF=0)
0F 8B cw/cd JNP rel16/32 Ближний переход, если нечетно (PF=0)
0F 89 cw/cd JNS rel16/32 Ближний переход, если положительно (SF=0)
0F 85 cw/cd JNZ rel16/32 Ближний переход, если не нуль (ZF=0)
0F 80 cw/cd JO rel16/32 Ближний переход, если переполнение (OF=1)
0F 8A cw/cd JP rel16/32 Ближний переход, если паритет (PF=1)
0F 8A cw/cd JPE rel16/32 Ближний переход, если четно (PF=1)
0F 8B cw/cd JPO rel16/32 Ближний переход, если нечетно (PF=0)
0F 88 cw/cd JS rel16/32 Ближний переход, если отрицательно (SF=1)
Название: Re: Больше или равно
Отправлено: Geniepro от Май 02, 2012, 12:45:02 pm
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.
Да я не про машинные операции, а про умственные.
Что бы понять выражение "~(a > 10)" нужно сначала определить, больше ли а чем 10, а затем ещё и инвертировать результат. Смысл?
Название: Re: Больше или равно
Отправлено: ilovb от Май 02, 2012, 12:51:54 pm
А это:
(A <= 10)в уме не так выглядит?  ;)
(A < 10) OR (A = 10)
Название: Re: Больше или равно
Отправлено: ilovb от Май 02, 2012, 01:02:08 pm
Вот кстати я даже в SmartLight так написал:
WHILE ~rd.eot & ((end = 0) OR ~(rd.Pos() > end)) DO
 :)
Название: Re: Больше или равно
Отправлено: Geniepro от Май 03, 2012, 07:59:49 am
Ну хз кому как, а мне фраза "а меньше или равно 10" кажется более удобной, чем "а не больше 10"...