以下,这是首选的做事方式,为什么?是否有任何具体情况会产生任何影响,假设函数bar()在任何时候都没有取零值?
案例1:测试两个条件的真值
if ((foo = bar()) && foo < 0)
error();
案例2:仅测试分配的变量
if ((foo = bar()) < 0)
error();
答案 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>