如果有条件,则为内部变量赋值 - 总是不好的做法?
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" 可以非常黑白分明,但其他一些则更灵活。我相信,如果你能做到连贯、可读和高效,那你就做得很好。我通常不会这样做,但我绝对会在给定的上下文中最有意义的时候这样做。
我会让你来决定它是好是坏,但这里有一些注意事项。
赋值运算符和相等比较运算符看起来太相似了。即使上下文没有歧义,读起来还是需要更多的脑力。
编译器和静态分析器等工具可能无法理解您的意图并仍然发出警告。
短路求值中的赋值,可能大家看不懂
还有其他选择。赋值可以放在 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();
在 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" 可以非常黑白分明,但其他一些则更灵活。我相信,如果你能做到连贯、可读和高效,那你就做得很好。我通常不会这样做,但我绝对会在给定的上下文中最有意义的时候这样做。
我会让你来决定它是好是坏,但这里有一些注意事项。
赋值运算符和相等比较运算符看起来太相似了。即使上下文没有歧义,读起来还是需要更多的脑力。
编译器和静态分析器等工具可能无法理解您的意图并仍然发出警告。
短路求值中的赋值,可能大家看不懂
还有其他选择。赋值可以放在
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();