如果有条件的话,为里面的变量赋值 - 总是不好的做法?

时间:2017-10-12 01:44:13

标签: c conditional

编程在if条件空间内为变量赋值是不是一种错误的做法?检查这个例子,如果不清楚我的意思是什么:

int c;
//code...
if ( foo1() == 1 || ( (c = foo2()) == -1)) //true if foo1 == 1 or foo2 == -1
    //more code...

我的指示方式是将c = foo2()放在外面。但是,想象一下foo2()是否是一个昂贵的功能。变量 c 的归属是一种糟糕的编程习惯,即使在这种情况下也是如此?

4 个答案:

答案 0 :(得分:3)

在编码实践方面,始终也绝不会占有一席之地。我们作为专业开发人员的部分工作是在功能,效率和易维护性之间保持适当的平衡。

我绝对同意你所描述的是我会投入“强烈避免”类别的东西,因为它肯定会使代码更难以理解,因此会导致在维护期间潜入漏洞的风险更高。

答案 1 :(得分:1)

如果你真的不想这样做,你可以这样写:

int c;
//code...
c =  foo1();

if ( c != 1)
{
    c = foo2();
}

if(c == 1 || c == -1){...
    //more code...

答案 2 :(得分:1)

良好实践是编写连贯,可读和高效的代码。虽然一些“规则”可能非常黑白,但其他规则更灵活。我相信,如果你能够实现连贯,可读和高效,那你就做得很好。我通常不会这样做,但我绝对有在特定情况下最有意义的时候。

答案 3 :(得分:1)

我会让你决定它的好坏,但这里有一些考虑因素。

  1. 赋值运算符和相等比较运算符看起来太相似了。即使上下文是明确的,它仍然需要更多的心理努力来阅读。

  2. 编译器和静态分析器等工具可能无法理解您的意图,仍会发出警告。

  3. 每个人都不了解短路评估中的分配。

  4. 还有其他选择。作业可以放在if条件之外。

  5. 这是另一种选择。

    条件仍然可以放在if语句之外并存储在布尔变量中。并且仍然可以使用短路评估。

    bool condition = foo1() == 1 || ( (c = foo2()) == -1);
    
    if (condition)
        op();
    

    C ++ 17在初始化时引入了if语句。

    if (bool condition = foo1() == 1 || ( (c = foo2()) == -1); condition)
        op();