C 在if条件中为变量赋值-总是不好的做法?
编程为if条件空间内的变量赋值总是一种糟糕的做法吗?如果不清楚我的意思,请检查此示例:C 在if条件中为变量赋值-总是不好的做法?,c,conditional,C,Conditional,编程为if条件空间内的变量赋值总是一种糟糕的做法吗?如果不清楚我的意思,请检查此示例: 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...
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...
如果你真的不想这样做,你可以这样写:
int c;
//code...
c = foo1();
if ( c != 1)
{
c = foo2();
}
if(c == 1 || c == -1){...
//more code...
当涉及到编码实践时,总是和从不很少有一席之地。作为专业开发人员,我们的部分工作是在功能、效率和易于维护之间保持适当的平衡
我完全同意您所描述的内容属于“极力避免”的范畴,因为这无疑会使代码更难理解,因此在维护过程中引入更高的bug风险。在编码实践中,总是有一席之地,也从来没有。作为专业开发人员,我们的部分工作是在功能、效率和易于维护之间保持适当的平衡
我完全同意您所描述的内容属于“极力避免”类别,因为这无疑会使代码更难理解,从而导致在维护过程中错误潜入的风险更高。好的做法是编写连贯、可读且高效的代码。虽然有些“规则”可以是黑白相间的,但有些则更灵活。我相信,如果你能做到连贯、可读和高效,你就会做得很好。我通常不会这样做,但在给定的上下文中,当它最有意义时,我肯定会这样做。好的实践是编写连贯、可读且高效的代码。虽然有些“规则”可以是黑白相间的,但有些则更灵活。我相信,如果你能做到连贯、可读和高效,你就会做得很好。我通常不会这样做,但在给定的上下文中,当它最有意义时,我肯定会这样做。我会让你来决定它是好是坏,但这里有一些考虑因素
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
语句之外,并存储在布尔变量中。短路评估仍然可以使用
bool condition = foo1() == 1 || ( (c = foo2()) == -1);
if (condition)
op();
C++17引入了带有初始化的if
语句
if (bool condition = foo1() == 1 || ( (c = foo2()) == -1); condition)
op();
如果它很昂贵,并且您试图短路,您可以使用嵌套If。在我看来,现在总是不好的,但是如果代码阅读器不够小心,它可能会导致开发人员错误和/或误解。我怀疑这将被视为“主要基于意见”,因为每个人对代码样式都有自己的意见。这是一种权衡;在我喜欢之前遇到过这种模式,我可以一眼看到正在发生的事情;如果我们“正确地重写该行”,它将需要一个中间变量和几行代码,这可能需要更长的时间来消化。另一方面,从未见过这种情况的人可能会对正在发生的事情感到困惑。话虽如此,在“更多代码”部分,
c
在foo1()==1
的情况下将被取消初始化,因此我们很可能会看到“意大利面代码”,如果有人对“更多代码”进行更改,它很容易引入错误,忽略了在foo1()==1
案例中不读取c
的值是很小心的。@Homunculus是的,通常发生的情况是一群人在帖子中谈论他们喜欢的代码样式;有时候这是有价值的,但网站的版主们认为这往往会变成一堆无用的想法;而((c=getchar())!=EOF){/*进程字符c*/}则更难编写,因为必须将赋值移出条件。如果代价高昂且您试图短路,则可以使用嵌套If。在我看来,现在总是不好的,但是如果代码阅读器不够小心,它可能会导致开发人员错误和/或误解。我怀疑这将被视为“主要基于意见”,因为每个人对代码样式都有自己的意见。这是一种权衡;在我喜欢之前遇到过这种模式,我可以一眼看到正在发生的事情;如果我们“正确地重写这行”,它将需要一个中间变量和几行co