Oberon space
General Category => Общий раздел => Тема начата: ilovb от Апрель 28, 2012, 07:50:02 am
-
У меня есть один бзик. Я не люблю в коде операции "<=" и ">=". Всегда стараюсь выражать через отрицание.
например такое:
IF a <= 10 THEN
dosomething();
END;
пишу так:
IF ~(a > 10) THEN
dosomething();
END;
Т.е. я лучше воспринимаю, если явно написано "не больше"
Я один такой?
-
Если а целочисленная, то вместо a <= 10 я пишу a < 11.
-
Если нет рационального объяснения поведению, то наверно таки бзик. ;)
-
Понятно что Фрейд ;D
Мне просто интересно, это мой личный бзик, или это коллективное бессознательное...
-
Понятно что Фрейд ;D
Мне просто интересно, это мой личный бзик, или это коллективное бессознательное...
Да, я тоже избегаю нестрогих неравенств. Правда до отрицания не довожу :)
-
У меня есть один бзик. Я не люблю в коде операции "<=" и ">=". Всегда стараюсь выражать через отрицание.
Две операции вместо одной? о_О Смысл?
-
Нету никакого смысла. Просто интуитивное неприятие "<=" и ">="
И как оказалось не только у меня :)
-
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.
-
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в 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)
-
Две операции вместо одной? о_О Смысл?
Ну как бы там не совсем две операции. Есть машинная инструкция "пререйти если да" и есть машинная инструкция "пререйти если нет", так что если в IF поставить отрицание всего выражения, то машинный код увеличится не должен, просто должна будет выбрана другая машинная инструкция.
Да я не про машинные операции, а про умственные.
Что бы понять выражение "~(a > 10)" нужно сначала определить, больше ли а чем 10, а затем ещё и инвертировать результат. Смысл?
-
А это:
(A <= 10)в уме не так выглядит? ;)
(A < 10) OR (A = 10)
-
Вот кстати я даже в SmartLight так написал:
WHILE ~rd.eot & ((end = 0) OR ~(rd.Pos() > end)) DO
:)
-
Ну хз кому как, а мне фраза "а меньше или равно 10" кажется более удобной, чем "а не больше 10"...