带有条件赋值的嵌套否定 if 语句

Posted

技术标签:

【中文标题】带有条件赋值的嵌套否定 if 语句【英文标题】:Nested negative if statements with assignments in condition 【发布时间】:2017-05-28 06:19:01 【问题描述】:

我有以下代码:

if (!$x = some_function(1)) 
    if (!$x = some_function(2)) 
        return something;
    

我想知道以下哪些语句是等价的:

A.

if (some_function(1)) 
    $x = some_function(1));

else if (some_function(2)) 
    $x = some_function(2));

else 
    return something;

或者如果它本质上是说它应该被覆盖,就像这样:

乙。

if (some_function(1)) 
    $x = some_function(1));

if (some_function(2)) 
    $x = some_function(2));

if (!$x) 
    return something;

问题的另一种表述方式:在if 语句中的赋值中,是先为false 评估变量,然后再为false 赋值,还是先赋值,然后评估变量下一个?

【问题讨论】:

先赋值给$x,然后是条件测试。 另外,这个赋值仍然在作用域内,所以很容易在这个地方不经意间泄露变量。 【参考方案1】:

第一个语句不等同于其他任何语句。相当于这样:

$x = some_function(1); // assign $x first
if(!$x) // check if $x is falsy
  $x = some_function(2); // overwrite $x (not the function itself)
  if(!$x) // check if $x is still falsy
   // do stuff
  

或者,如果变量不重要,这也是等价的

if(!some_function(1) && !some_function(2))...

唯一的区别是第一个总是为$x 提供一个值,这可能在其他地方使用。

这个也一样,用三进制

$x = some_function(1) ? some_function(1) : some_function(2);
if(!$x) // do stuff

【讨论】:

【参考方案2】:

感谢 Scuzzy 的澄清 - 似乎正确的等价物是这样的:

if (some_function(1)) 
    $x = some_function(1));

if (!$x && some_function(2)) 
    $x = some_function(2));

if (!$x) 
    return something;

【讨论】:

以上是关于带有条件赋值的嵌套否定 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的条件赋值语句和if——else语句执行效率比较,哪一个效率高些,坐等高手解惑

c语言中if语句条件为赋值语句

if 语句中的赋值语句如何作为条件?

分支语句

Notes 20180308 : 语句

if 语句中的变量赋值