如果有条件,则为内部变量赋值 - 总是不好的做法?

Assigning values for variables inside if conditional - Allways bad practice?

在 if 条件 space 中为变量赋值总是一种不好的编程实践吗?检查这个例子,如果不清楚我的意思:

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

我被指示的方式是将 c = foo2() 放在 if 外面。但是,想象一下如果 foo2() 是一个昂贵的函数。即使在这种情况下,变量 c 的这种属性是否是一种不良的编程习惯?

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

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

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

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

在编码实践中,Always 和 Never 很少占有一席之地。作为专业开发人员,我们的部分工作是在功能、效率和易维护性之间保持适当的平衡。

我绝对同意您所描述的是我将归入“强烈避免”类别的内容,因为它肯定会使代码更难以理解,结果在维护过程中引入错误的风险更高。

好的做法是编写连贯、可读且高效的代码。虽然有些 "rules" 可以非常黑白分明,但其他一些则更灵活。我相信,如果你能做到连贯、可读和高效,那你就做得很好。我通常不会这样做,但我绝对会在给定的上下文中最有意义的时候这样做。

我会让你来决定它是好是坏,但这里有一些注意事项。

  1. 赋值运算符和相等比较运算符看起来太相似了。即使上下文没有歧义,读起来还是需要更多的脑力。

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

  3. 短路求值中的赋值,可能大家看不懂

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

还有一个替代方案。

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

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

if (condition)
    op();

C++17 引入了带初始化的 if 语句。

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