在if语句中分配和测试变量的最合适方法是什么?

时间:2012-11-01 11:52:25

标签: c

以下,这是首选的做事方式,为什么?是否有任何具体情况会产生任何影响,假设函数bar()在任何时候都没有取零值

案例1:测试两个条件的真值

if ((foo = bar()) && foo < 0)
    error();

案例2:仅测试分配的变量

if ((foo = bar()) < 0)
    error();

5 个答案:

答案 0 :(得分:14)

首选方法是将它们分开:

foo = bar();
if (foo < 0)
    error(); 

编辑:这是可读性和避免错误的更好方法,例如在第一种情况下:

if (foo = bar() && foo < 0)
    error();

应该是:

if ((foo = bar()) && foo < 0)
    error();

答案 1 :(得分:2)

第一个是完全错误的。由于优先规则,您得到:

if (foo = (bar() && foo < 0))
    error();

通常不是你所期望的。

答案 2 :(得分:0)

第一个示例有效,但如果有人试图将<更改为<=>=,则会爆炸:对于bar返回0,它会测试和声明的第一部分并将其视为假,中止第二次检查,这应该是真的。

此外,您的第一个示例没有执行它应该执行的操作:=的运算符优先级小于&&,因此您可以将&amp;&amp; -operation的结果赋值给{{ 1}}

所以我更喜欢第二个例子。

答案 3 :(得分:0)

在大多数情况下无关紧要。你的第一个案例有一些冗余,所以我更倾向于第二个建议的简短。

在某些情况下,这种方法不够好,特别是在多线程环境中,您的变量是共享资产(设置和测试操作在那里很常见)。在这种情况下,需要适当地保护对变量的访问(即通过锁定)以避免竞争和数据损坏。

答案 4 :(得分:0)

如果您尝试在条件额外括号内进行分配,则大多数编译器(如果不是全部)都会发出警告。

但是在大​​多数情况下,我认为它对复合语句的可读性较低,而在Ruby中说它在C语言中是不常见的。没有理由永远不会通过代码审查IMO。< / p>