В паскале остро не хватает операторов &, &&, | и ||

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Код: Выделить всё

if a > 0 and b > boolean(0) then

вполне работает))
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

скалогрыз писал(а):И кстати, попускать слюни на Си/Си++, где такие вещи можно! (т.к. boolean типа там нет... ну или не было, но по факту, им не очень руководствуются)


И где это неисчерпаемый источник ошибок. А ведь достаточно сменить приоритет оператора and и компилятор проглотит условие.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Лекс Айрин писал(а):И где это неисчерпаемый источник ошибок. А ведь достаточно сменить приоритет оператора and и компилятор проглотит условие.

я не завидую судьбе того шутника, который попробует изменить приоритет оператора. :mrgreen: :mrgreen: :mrgreen:
zub писал(а):вполне работает))

шикарное решение! так можно проверять людей на понимание что вообще происходит, и что-такое программирование :mrgreen: :mrgreen: :mrgreen:
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

скалогрыз писал(а): который попробует изменить приоритет оператора. :mrgreen: :mrgreen: :mrgreen:


Не забывай, что у тех, кто работает в других языках приоритеты могут отличаться. И потом, если это делать не для галочки, а серьезно подумав, то ничего страшного не произойдет.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

ничего страшного не произойдёт - конечно.
можно, например, поменять, законадетльно, красный и зелёный цвета... ну так... серьёзно подумав.
А на утро посмотреть что будет происходить... :mrgreen:

но, если не уверен - ставь скобки ;)
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

скалогрыз писал(а):можно, например, поменять, законадетльно, красный и зелёный цвета... ну так... серьёзно подумав.

Ну, если честно, то законодательно разрешено переходить на красный цвет... если он для машин... Да и, текущая ситуация со светофорами тоже не пример для подражания. На перекрестках она периодически вызывает ситуации когда машины прут перед людьми. Один такой перекресток около работы 2-3 раза в год собирает стекло. Там переход это целый квест. Так что... я добавил бы во ВСЕ светофоры сигнал "зеленый только для поворачивающих машин".
скалогрыз писал(а):но, если не уверен - ставь скобки ;)

ППКС
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

Как раз таки произойдёт, все выражения вида "x and mask = 0" в существующих исходниках при переходе на новую версию языка сломаются, и это очень плохо (напомню, что fpc -- это не будущий, а существующей и развивающийся язык, одной из целей которого является совместимость с существующей кодобазой).
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Дож, не стоит забывать, что случаи ухода от совместимости с текущей кодобазой не единичны и зачастую заставляют переписывать код.... взять тот же переход на utf8. Причем, я не предлагаю взять и тупо увеличить приоритет булевых операций, а вначале посмотреть стоит ли это вообще делать. Подозреваю, что ничего страшного, а то и вообще обойдется без эксцессов.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

скалогрыз писал(а):

Код: Выделить всё

var
  a,b : integer;
begin
  if a > 0 and b > 0 then

внимательно смотрим список приоритетов
видим - что у оператора "and" приоритет выше, чем у оператора сравнивания, по-этому выражение выше, оператор видит, как

Код: Выделить всё

var
  a,b : integer;
begin
  if (a > (0 and b)) > 0 then

т.к. и 0 и b это тип INTEGER, то результат его работы, это INTEGER.
и получаем выражение:

Код: Выделить всё

  if (a > NNN) > 0 then

,где NNN - это некое число.

Не, не "внимательно смотрим", а читаем ошибку:

Изображение
Потому, только вот так:

Код: Выделить всё

var
  a,b : integer;
begin
  if (a > 0) and (b > 0) then

И не нужно ничего сочинять, как там оно будет выглядеть.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

sign писал(а):И не нужно ничего сочинять, как там оно будет выглядеть.


Но это же получается косяк компилятора. Т. е. программист пытается исправить то, что компилятор должен делать сам.
ElectroGuard
новенький
Сообщения: 71
Зарегистрирован: 03.06.2016 11:10:22

Сообщение ElectroGuard »

Это не косяк компилятора, это отличная фича компилятора, который сам находит потенциально опасные и глючные места.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

ElectroGuard, это помощь, которая хуже вреда.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Лекс Айрин писал(а):Но это же получается косяк компилятора. Т. е. программист пытается исправить то, что компилятор должен делать сам.

вообще boolean это тип integer , его ввели для облечении программисту или читающего его программу..

не будете же делать так:

Код: Выделить всё

var 
 visible:integer;
..
begin
  visible:=0;
...
  visible:=checkbox.visible and checkbox2.visible and  checkbox2.visible;
...
  visible:=visible xor $FFFFFFFF;
..
 if visible then
  format_disk_c.run();

и потом разбираться что там в if visible then ноль или не ноль.. а если кто то решил что

Код: Выделить всё

const 
MY_VISIBLE=37261;
MY_NOT_VISIBLE=23842;

вот и думай тру или не тру..

а кто кодил биты портов микроконтроллеров тот меня прекрасно поймет..

Добавлено спустя 13 минут 4 секунды:
А кто то решит что ему место мало - и загонит фалжки в тип int64 ..
и потом Hex-и.. выясняй какие биты включены, а какие выключенные.. все нужно это держать в голове..
оперируй 9223372036854775807 числами, переводи в шестнадцатеричное $7FFFFFFFFFFFFFFF, а потом в биты 00011001001000010000110000010010101000010000110..
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

olegy123 писал(а):вообще boolean это тип integer , его ввели для облечении программисту или читающего его программу..


Вообще, согласно правилам паскаля boolean это отдельный тип и опираться на его реализацию не есть тру "за это бьют больно и сажают надолго" (с).
ElectroGuard
новенький
Сообщения: 71
Зарегистрирован: 03.06.2016 11:10:22

Сообщение ElectroGuard »

ElectroGuard, это помощь, которая хуже вреда.

Это отличная помощь. Это одно из того, что отличает паскаль от недо-языков типа плюсов. Зачем мне делать работу за компилятор? Думать о чем-то. Пусть он за меня думает.

По теме:

if ((($dop1 == 0) && ($dop2 == 0)) || (($dop1 != 0) && ($dop2 == 0))) {
//...
}
Ответить