热门问题
时间线
聊天
视角
尤达条件式
来自维基百科,自由的百科全书
Remove ads
尤达条件式(英语:Yoda conditions,也称为尤达标记法)是一种计算机编程中的编程风格。此风格写成的条件句中,条件式两侧的部件互换(如:将常量置于比较运算符左侧)。这种风格的名称来自于星际大战的绝地大师尤达,他使用不合标准语法的英语。尤达条件式是PHP Symfony编码标准的一部分。[1]
此条目需要补充更多来源。 (2019年5月27日) |
示例
通常计算机编程中的条件语句会写成:
if ( $value == 42 ) { /* ... */ }
// 「如果 value 等於 42」
在尤达条件式中对于相同的条件语句会反转过来:
if ( 42 == $value ) { /* ... */ }
// 「如果 42 等於 value」
常量会放在比较运算符的左侧,变量则至于运算符右侧。这个次序和尤达的非标准口语风格非常相似,类似于宾主动语序[2](例如“When nine hundred years old you reach, look as good you will not.”“当九百岁你活到,看起来很好你将不”[3][4])。
优点
多数编程语言使用单个等号(=)表示赋值操作,用双等号(==)表示相等比较。在打错字时,会产生语义错误:
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 是常量,因此编译器会捕捉到该错误。
以下代码中的语法完全正确,但是mystring为空值。试图在空值上调用方法,会产生例外。
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// 在 Java 中,產生 NullPointerException
以尤达条件式可免除此问题(此行为可能是缺点,见下文):
String myString = null;
if ("foobar".equals(myString)) { /* ... */ }
// 求值結果為 false
有些编程语言不支持如a < b < c的连关系表逹式。在转写时,用尤达条件式,可提升可读性:
int i = 1;
int j = 4;
int k = 5;
if (i < j && j < k) {
// 此為 i < j < k 之轉寫。
}
Remove ads
评论
一些编程语言,如Python和Swift,不允许在条件式中进行对变量赋值,或者定义赋值操作没有回传值。在这种情况下,不可能错把比较式误写作赋值。[5]
许多编译器会对如if (myNumber = 42)的源码发出警示消息(例如,GCC-Wall选项会警告括号语句中的赋值为真),让程序员发现可能发生错误的地方。在JavaScript中如ESLint之类的语法建议程序,可以警告条件式中出现赋值操作。[6]
尤达条件式写法能忽略空值,但可能使有问题的资料通过筛检,使得后面的程序出错。
当比较非基类型时,这种写法在C++中出现了另一个缺点,因为 == 是一个运算符,并可能没有定义适当的重载运算符函数,例如CComBSTR与字符串文本比较,写成(L"Hello" == cbstrMessage),不会对应到重载的函数。[7]
参考
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads