ヨーダ記法

技法・仕組み・アルゴリズム
表現方法
Empty
2024/01/10 10:14
Empty
Empty
Empty
Empty
Empty
9 more properties
ヨーダ記法とは、判定式の書き方で、比較変数と比較対象の順番を逆にする記法です。
例:
var a = 0 if a == 1 { // ←通常の記法 // ... } if 1 == a { // ←ヨーダ記法 // ... }
この記法が誕生した背景としては、C言語などの場合、代入自体も評価可能なので
if
文の判定条件などにも使えてしまい、それにより意図しないバグ等が多発したためです。
例:
// C言語の場合 int a = 0; if (a = 1) { // ←本当はaが1であるかどうかを評価したかったが、`=` が一つ足りなかったため代入してしまいました printf("%d", a); // 本来はaが0なのでここに入らないはずなのに、判定式が代入文だったため、その代入が成功し、ここに入ってしまって"1"が出力されてしまいます }
このようなミスを防ぐために、リテラルは代入不可という言語仕様を利用して、比較したい時に間違って代入式を書いてしまったらコンパイルエラーにするために、ヨーダ記法が考案されました。
// C言語の場合 int a = 0; if (1 = a) { // ←1というリテラルに代入できないため、ここでコンパイルエラーが発生し、プログラマに `1 == a` と書くべきことが伝わります printf("%d", a); // 上記の判定式を `1 == a` に直した場合、a!=1なのでここの処理がされません;またaの値も0のままです }
ただし、Swiftの場合は代入文はそもそも評価されず、if文などの条件判定式に使えないため、読みにくいヨーダ記法は基本非推奨です。
// Swiftの場合 var a = 0 if a = 1 { // ←ここでコンパイルエラーが発生しますので通常の記法でも問題ありません print("\(a)") // 上の判定式を `a == 1` に直した場合、a!=1なのでここの処理がされません;またaの値も0のままです }