编程在if条件空间内为变量赋值是不是一种错误的做法?检查这个例子,如果不清楚我的意思是什么:
int c;
//code...
if ( foo1() == 1 || ( (c = foo2()) == -1)) //true if foo1 == 1 or foo2 == -1
//more code...
我的指示方式是将c = foo2()
放在外面。但是,想象一下foo2()
是否是一个昂贵的功能。变量 c 的归属是一种糟糕的编程习惯,即使在这种情况下也是如此?
答案 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)
我会让你决定它的好坏,但这里有一些考虑因素。
赋值运算符和相等比较运算符看起来太相似了。即使上下文是明确的,它仍然需要更多的心理努力来阅读。
编译器和静态分析器等工具可能无法理解您的意图,仍会发出警告。
每个人都不了解短路评估中的分配。
还有其他选择。作业可以放在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();