Автор Тема: Больше или равно  (Прочитано 5363 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Больше или равно
« : Апрель 28, 2012, 07:50:02 am »
У меня есть один бзик. Я не люблю в коде операции "<=" и ">=". Всегда стараюсь выражать через отрицание.

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

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

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

Я один такой?
« Последнее редактирование: Апрель 28, 2012, 07:52:04 am от ilovb »

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Больше или равно
« Ответ #1 : Апрель 28, 2012, 09:38:26 am »
Если а целочисленная, то вместо a <= 10 я пишу a < 11.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Больше или равно
« Ответ #2 : Апрель 28, 2012, 10:44:04 am »
Если нет рационального объяснения поведению, то наверно таки бзик.  ;)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Больше или равно
« Ответ #3 : Апрель 28, 2012, 11:24:53 am »
Понятно что Фрейд  ;D

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Больше или равно
« Ответ #4 : Апрель 28, 2012, 02:52:13 pm »
Понятно что Фрейд  ;D

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

Да, я тоже избегаю нестрогих неравенств. Правда до отрицания не довожу :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Больше или равно
« Ответ #5 : Апрель 30, 2012, 06:03:40 am »
У меня есть один бзик. Я не люблю в коде операции "<=" и ">=". Всегда стараюсь выражать через отрицание.

Две операции вместо одной? о_О Смысл?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Больше или равно
« Ответ #6 : Апрель 30, 2012, 12:49:02 pm »
Нету никакого смысла. Просто интуитивное неприятие "<=" и ">="

И как оказалось не только у меня :)
« Последнее редактирование: Апрель 30, 2012, 12:51:53 pm от ilovb »

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Больше или равно
« Ответ #7 : Май 02, 2012, 10:20:58 am »
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.

alexus

  • Гость
Re: Больше или равно
« Ответ #8 : Май 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)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Больше или равно
« Ответ #9 : Май 02, 2012, 12:45:02 pm »
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.
Да я не про машинные операции, а про умственные.
Что бы понять выражение "~(a > 10)" нужно сначала определить, больше ли а чем 10, а затем ещё и инвертировать результат. Смысл?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Больше или равно
« Ответ #10 : Май 02, 2012, 12:51:54 pm »
А это:
(A <= 10)в уме не так выглядит?  ;)
(A < 10) OR (A = 10)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Больше или равно
« Ответ #11 : Май 02, 2012, 01:02:08 pm »
Вот кстати я даже в SmartLight так написал:
WHILE ~rd.eot & ((end = 0) OR ~(rd.Pos() > end)) DO
 :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Больше или равно
« Ответ #12 : Май 03, 2012, 07:59:49 am »
Ну хз кому как, а мне фраза "а меньше или равно 10" кажется более удобной, чем "а не больше 10"...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…