C 在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的这种属性是一种不好的编程习惯吗?如果您真的不想这样做,您可以这

编程为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...
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