"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