当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你为什么要在条件下使用作业?》经验,为你挑选了6个好方法。

在许多语言中,作业在条件上是合法的.我从来不明白这背后的原因.你为什么要写:

if (var1 = var2) {
  ...
}

代替:

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

Gerald.. 105

它比if语句更有用于循环.

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

否则必须写

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

我同意 - 但会写:while((var = GetNext())!= 0){...}没有考虑过两次,部分是因为GCC抱怨如果我不使用我的默认编译选项. (13认同)

@wirrbel:你的意思是1989年的ANSI C?就像他们有蒸汽机和打卡牌一样?可能是这种情况,但这是相关的吗? (6认同)

这个警告不是因为一段时间内任务有任何问题,而是因为当你真正打算进行比较时做一项任务是一个常见的错误.如果你想摆脱警告,你可以做JS @Jonathan Leffler建议的等价物.就个人而言,我可能会这样做,因为我多么不信任JavaScript truthy规则:)还应该注意在某些语言如C#和Java这是唯一的方法. (3认同)


Jonathan Lef.. 31

我觉得它在行动链中最有用,通常涉及错误检测等.

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,而条件分配版本不会这样做.



1> Gerald..:

它比if语句更有用于循环.

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

否则必须写

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


我同意 - 但会写:while((var = GetNext())!= 0){...}没有考虑过两次,部分是因为GCC抱怨如果我不使用我的默认编译选项.
@wirrbel:你的意思是1989年的ANSI C?就像他们有蒸汽机和打卡牌一样?可能是这种情况,但这是相关的吗?
这个警告不是因为一段时间内任务有任何问题,而是因为当你真正打算进行比较时做一项任务是一个常见的错误.如果你想摆脱警告,你可以做JS @Jonathan Leffler建议的等价物.就个人而言,我可能会这样做,因为我多么不信任JavaScript truthy规则:)还应该注意在某些语言如C#和Java这是唯一的方法.

2> Jonathan Lef..:

我觉得它在行动链中最有用,通常涉及错误检测等.

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,而条件分配版本不会这样做.



3> Chris Young..:

如果你正在调用一个函数,它会更有用:

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),但我认为上面是一个相当可读的习语.


我认为您应该将其括在圆括号中,否则gcc会抱怨:警告:建议在用作真值的赋值周围加上括号[-Wparentheses]像这样:if((n = foo())){//用返回值做某事} else {// foo返回零/ NULL,执行其他操作}

4> Michael Burr..:

如果您正在调用返回要处理的数据的函数或指示错误的标志(或您已完成),那么它将非常有用.

就像是:

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

// end of file reached...

就个人而言,这是一个我不太喜欢的习语,但有时替代方案更加丑陋.



5> JesperE..:

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

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

即使用额外的括号表示这确实是你想要的.



6> Greg Hewgill..:

当你编写while循环而不是if语句时,这个习惯用法更有用.对于if声明,您可以按照描述进行分解.但是如果没有这种结构,你要么必须重复自己:

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

或使用循环结构:

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

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

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有