Так
Ви завжди повинні використовувати дужки ... ви не контролюєте порядок пріоритетності ... розробник компілятора робить. Ось історія, яка трапилася зі мною про невикористання дужок. Це вплинуло на сотні людей протягом двох тижнів.
Реальна світова причина
Я успадкував додаток main-frame. Одного разу з ясного синього кольору він перестав працювати. Ось це ... пуф просто зупинився.
Моя робота полягала в тому, щоб якомога швидше це працювало. Вихідний код не змінювався протягом двох років, але раптом він просто припинився. Я спробував скласти код, і він зламався на лінії XX. Я подивився на лінію XX і не міг сказати, що зробить лінію XX розривом. Я попросив детальні характеристики цієї програми, і таких не було. Лінія XX не стала винуватцем.
Я роздрукував код і почав переглядати його зверху вниз. Я почав створювати блок-схему того, що відбувається. Код був настільки вивернутий, що я навряд чи міг його зрозуміти. Я відмовився від спроб схематичної схеми. Я боявся вносити зміни, не знаючи, як ця зміна вплине на інший процес, тим більше, що я не мав деталей того, що робила програма чи де вона знаходилась у ланцюжку залежностей.
Отже, я вирішив почати вгорі вихідного коду і додати whitespce та рядкові гальма, щоб зробити код більш читабельним. Я помітив, що в деяких випадках існували умови, які поєднувались, AND
і OR
це було не чітко розмежоване між тим, які дані AND
редагуються, і тими, що OR
редагуються. Тому я почав ставити круглі дужки навколо AND
та OR
умови, щоб зробити їх більш зрозумілими.
Коли я повільно рухався вниз, прибираючи його, я періодично економив свою роботу. Якось я спробував скласти код і відбулася дивна річ. Помилка перескочила початковий рядок коду і тепер була внизу. Тож я продовжив, викладаючи умови AND
і OR
з паренами. Коли я закінчив його чистити, це спрацювало. Піди розберися.
Тоді я вирішив відвідати магазин операцій і запитати їх, чи нещодавно вони встановили якісь нові компоненти на основний каркас. Вони сказали, що так, ми нещодавно оновили компілятор. Гмммм.
Виявляється, старий компілятор оцінював вираз зліва направо незалежно. Нова версія компілятора також оцінювала вирази зліва направо, але неоднозначний код, що означає незрозуміле поєднання AND
і OR
не вдалося вирішити.
Урок, який я навчився з цього ... ВЖЕ, ВЖЕ, ВИНАГИ використовують парени для відокремлених AND
умов і OR
умов, коли вони використовуються спільно один з одним.
Спрощений приклад
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(код завалений кількома з них)
Це спрощена версія того, з чим я стикався. Були й інші умови зі складними булевими логічними твердженнями.
Я пам’ятаю, як це було:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
Я не зміг її переписати, оскільки специфікацій не було. Оригінального автора давно не було. Я пам’ятаю інтенсивний тиск. Цілий вантажний корабель був перекинутий у порт і його не можна було вивантажити, оскільки ця маленька програма не працювала. Без попередження Немає змін у вихідному коді. Мені тільки приснилося запитати в Мережевих операціях, чи вони щось змінили після того, як я помітив, що додавання паронів змінює помилки.