"Backwards" C 中的条件语句
"Backwards" Conditionals in C
我正在查看一些代码,发现了一些奇怪的条件,即:
if (NULL != buf) {...}
我想知道是否有特殊原因要写这样的条件,而不是
if(buf != NULL){...}
我一开始想不出有什么理由这样做,但我不认为这是一个错误。在我看来,他们似乎完成了同样的事情,但第二种方式更直观。使用第一个条件是否有某些特定原因?
这是为了避免像if (buf = NULL)
这样的新手打字错误。
if (NULL = buf)
导致编译错误,而 if (buf = NULL)
是完全正确的,但有不需要的语义。
是的,它叫做“Yoda conditions”。这个想法是在您打算进行检查时不要意外地分配一个值。大多数现代编译器应该能捕捉到它。
概念基本是这样的:
新手经常会漏掉双等号 ==
,而是使用一个 =
。所以导师教他们这个方法,让他们不拘泥于简单的程序。
在没有启用编译器警告的情况下,如果您这样做:
if(buf = NULL)
你基本上是将 NULL 分配给 buf
,这在语法上没有错误,你不会收到任何警告,但是当你这样做时:
if(NULL = buf)
编译器会抛出错误,因为它知道你不能将任何东西赋值给 NULL。
Why Yoda in particular?
这是因为尤达这个角色,来自星球大战,他的对话是倒序的,比如“蓝色是天空”。
您可以阅读更多有趣的编码术语here。
如果将比较表达式错误地输入为赋值表达式,这将产生编译器错误。
例如,如果你编译
if (buf = NULL) {}
编译器说,
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
但是如果你把它改成
if (NULL = buf) {}
编译器现在说,
error: lvalue required as left operand of assignment
我正在查看一些代码,发现了一些奇怪的条件,即:
if (NULL != buf) {...}
我想知道是否有特殊原因要写这样的条件,而不是
if(buf != NULL){...}
我一开始想不出有什么理由这样做,但我不认为这是一个错误。在我看来,他们似乎完成了同样的事情,但第二种方式更直观。使用第一个条件是否有某些特定原因?
这是为了避免像if (buf = NULL)
这样的新手打字错误。
if (NULL = buf)
导致编译错误,而 if (buf = NULL)
是完全正确的,但有不需要的语义。
是的,它叫做“Yoda conditions”。这个想法是在您打算进行检查时不要意外地分配一个值。大多数现代编译器应该能捕捉到它。
概念基本是这样的:
新手经常会漏掉双等号 ==
,而是使用一个 =
。所以导师教他们这个方法,让他们不拘泥于简单的程序。
在没有启用编译器警告的情况下,如果您这样做:
if(buf = NULL)
你基本上是将 NULL 分配给 buf
,这在语法上没有错误,你不会收到任何警告,但是当你这样做时:
if(NULL = buf)
编译器会抛出错误,因为它知道你不能将任何东西赋值给 NULL。
Why Yoda in particular?
这是因为尤达这个角色,来自星球大战,他的对话是倒序的,比如“蓝色是天空”。
您可以阅读更多有趣的编码术语here。
如果将比较表达式错误地输入为赋值表达式,这将产生编译器错误。
例如,如果你编译
if (buf = NULL) {}
编译器说,
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
但是如果你把它改成
if (NULL = buf) {}
编译器现在说,
error: lvalue required as left operand of assignment