为什么要在条件中使用作业?

时间:2020-03-06 14:54:30  来源:igfitidea点击:

在许多语言中,条件分配是合法的。我从来不明白背后的原因。你为什么要写:

if (var1 = var2) {
  ...
}

代替:

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

解决方案

如果我们要调用一个函数以返回要处理的数据或者一个标志以指示错误(或者已完成),则该功能很有用。

就像是:

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

// end of file reached...

就个人而言,这是我不太喜欢的习惯用法,但有时替代方法比较丑陋。

如果要调用一个函数,它会更有用:

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

当然,我们可以将n = foo();放进去。在一个单独的语句上,然后是if(n),但我认为以上是一个相当易读的习惯用法。

当我们编写" while"循环而不是" if"语句时,该惯用法更为有用。对于if语句,可以按照描述将其分解。但是如果没有这种构造,我们或者不得不重复自己:

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

或者使用半个循环的结构:

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

我通常更喜欢半循环形式。

如果我们无意间尝试将分配用作真值,则GCC可以检测(使用-Wall)

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

IE。使用多余的括号表示这确实是我们想要的。

对于循环而言,它比if语句更有用。

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

否则必须写

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

例如,在PHP中,它对于遍历SQL数据库结果很有用:

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

这看起来比以下要好得多:

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

我发现它在经常​​涉及错误检测等操作的一系列动作中最有用。

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之外运行,而有条件分配版本则不能这样做。

简短的答案是,面向表达式的编程语言允许使用更简洁的代码。不要强迫我们将命令与查询分开。