尤达条件式(也称为尤达标记法)是一种计算机编程中的编程风格,其中表达式的两个部分与条件语句中的典型顺序相反。尤达条件式将表达式的常量部分放在条件语句的左侧。这个风格的名称源于星际大战绝地大师尤达的角色,他以非标准语法讲英语。
尤达条件式是PHP Symfony编码标准的一部分。
通常计算机编程中的条件语句会写成:
if ( $value == 42 ) { /* ... */ }// Reads like: "If the value is equal to 42..."
尤达条件式(也称为尤达标记法)是一种计算机编程中的编程风格,其中表达式的两个部分与条件语句中的典型顺序相反。尤达条件式将表达式的常量部分放在条件语句的左侧。这个风格的名称源于星际大战绝地大师尤达的角色,他以非标准语法讲英语。
尤达条件式是PHP Symfony编码标准的一部分。
通常计算机编程中的条件语句会写成:
if ( $value == 42 ) { /* ... */ }// Reads like: "If the value is equal to 42..."
尤达条件式描述相同的表达方式,但反转过来:
if ( 42 == $value ) { /* ... */ }// Reads like: "If 42 equals the value..."
常量写在比较运算符的左侧,要测试其值的变量写入右侧。这个次序相媲美于尤达的非标准口语风格,类似于宾主动语序(例如"When nine hundred years old you reach, look as good you will not.",“当九百岁你活到,看起来很好你将不”)。
在表达式中放置常量值不会改变程序的行为(除非此值被评估为false,请参见下文)。在使用单个等号(=)运行赋值操作而非条件关系比较的编程语法中,可能发生的错误使程序产生意料之外的赋值操作,而并非如程序员原意要编写关系判断的条件语句。
if (myNumber = 42) { /* ... */ }// This assigns 42 to myNumber instead of evaluating the desired condition
使用尤达条件式的优点:
if (42 = myNumber) { /* ... */ }// This is a syntax error and will not compile
由于 42 是一个无法变动的固定常量,因此编译器会捕捉到该错误。
Boolean myBoolean = true;if (myBoolean = null) { /* ... */ }// This causes a NullPointerException in Java Runtime, but legal in compilation.
它也可以解决一些不安全的null类型行为。
String myString = null;if (myString.equals("foobar")) { /* ... */ }// This causes a NullPointerException in Java
以尤达条件式:
String myString = null;if ("foobar".equals(myString)) { /* ... */ }// This is false, as expected
有评论认为尤达条件式的缺乏可读性是一个缺点,超过了上述优点。
一些编程语言如Python和Swift之中是不允许在条件式中进行对变量赋值操作的,借由定义赋值表达式不会被评估就没有任何值,在这种情况是不可能发生这类错误的。
许多编译器会对如if (myNumber = 42)
的源码发出警示消息(例如,GCC-Wall
选项会警告括号语句中的赋值为真),让程序员发现可能的错误点。在JavaScript中如ESLint之类的语法建议程序,可以警告条件式中出现赋值操作。
尤达条件式写法避免null行为的优点也可被认为是一个缺点,因为空指针错误或被隐藏,并只出现在程序后期中。
当比较非基类型时,这种写法在C++中出现了另一个缺点,因为 == 是一个运算符,并可能没有定义适当的重载运算符函数,例如CComBSTR
与字符串文本比较,写成(L"Hello" == cbstrMessage)
,不会对应到重载的函数。