はい
常に括弧を使用する必要があります...優先順位を制御しません...コンパイラの開発者が行います。括弧を使用しないことについて私に起こった話を次に示します。これは、2週間で何百人もの人々に影響を及ぼしました。
現実世界の理由
メインフレームアプリケーションを継承しました。ある日、澄んだ青から動き出しなくなりました。それだけです...パフは止まりました。
私の仕事は、できるだけ速く動作させることでした。ソースコードは2年間変更されていませんでしたが、突然停止しました。コードをコンパイルしようとすると、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") ...
仕様がなかったので書き直すことができませんでした。元の著者は長い間いなくなっていた。強いプレッシャーを覚えています。貨物船全体が港で立ち往生し、この小さなプログラムが機能しなかったため、荷を下すことができませんでした。警告なし。ソースコードに変更はありません。かっこを追加するとエラーがシフトすることに気付いた後、ネットワークオペレーションに何かを変更したかどうかを尋ねることになりました。