为什么你会使用条件的转让?(Why would you use an assignment in a

2019-07-20 21:45发布

在许多语言中的任务是在条件的法律。 我永远无法理解这背后的原因。 为什么你这样写:

if (var1 = var2) {
  ...
}

代替:

var1 = var2;
if (var1) {
  ...
}

Answer 1:

它是循环比if语句更加有用。

while( var = GetNext() )
{
  ...do something with var 
}

否则将被写入

var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}


Answer 2:

更为有用,如果你调用一个函数:

if (n = foo())
{
    /* foo returned a non-zero value, do something with the return value */
} else {
    /* foo returned zero, do something else */
}

当然,你可以把N = FOO(); 在另一份声明中,然后如果(N),但我认为上面是一个相当可读的成语。



Answer 3:

我觉得最有用的在其中往往涉及错误检测等行为链

if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}

替代(未使用中的条件分配)为:

rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}

随着旷日持久的错误检查,而分配功能于有条件的版本不这样做,替代可以运行页面的关闭RHS。



Answer 4:

如果你调用返回或者数据上工作或标志指示错误(或者说你做)的功能,可以是有用的。

就像是:

while ((c = getchar()) != EOF) {
    // process the character
}

// end of file reached...

就个人而言这是一个成语,我不喜欢巨大的,但有时选择是丑陋。



Answer 5:

GCC可以帮助您检测(用-Wall),如果你无意中尝试使用赋值为真值,如果它建议你写

if ((n = foo())) {
   ...
}

即使用额外的括号来表示,这是你要真的是。



Answer 6:

当你写一个成语是比较有用的while循环,而不是一个if语句。 对于if语句,你可以象你所说的打破它。 但是,如果没有这个结构,你要么不得不重复自己:

c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}

或使用循环和半结构:

while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}

我通常宁愿环和半形式。



Answer 7:

简短的回答是面向表达式的编程语言支持更简洁的代码。 他们不强迫你从查询分隔命令 。



Answer 8:

在PHP中,例如,它是有用的,通过SQL数据库结果循环:

while ($row = mysql_fetch_assoc($result)) {
    // Display row
}

这看起来不过如此:

$row = mysql_fetch_assoc($result);
while ($row) {
    // Display row
    $row = mysql_fetch_assoc($result);
}


Answer 9:

另一个优势是GDB的使用过程中。 在下面的代码,如果我们单步错误代码是不知道。

while (checkstatus() != -1) {
    // process
}

while (true) {
    int error = checkstatus();
    if (error != -1)
        // process
    else
        //fail
}

现在,在单一的步骤,我们可以知道什么是从的checkStatus返回错误代码()。



Answer 10:

原因是 :

  1. 性能改进(有时候)

  2. 小码(常亮)

举一个例子:有一个方法someMethod()并在if你想检查方法的返回值是否为状态null 。 如果你不打算再次使用的返回值。

If(null != someMethod()){
    String s = someMethod();
    ......
    //Use s
}

因为你所呼叫的同样的方法两次它会阻碍性能。 而是使用:

String s;
If(null != (s = someMethod())) {
    ......
    //Use s
}


文章来源: Why would you use an assignment in a condition?