以下哪一种是首选的做事方式,为什么?假设函数 bar() 在任何时候都不取零值,是否有任何特定情况会产生任何影响?
案例1:测试两个条件的真值
if ((foo = bar()) && foo < 0)
error();
案例 2:仅测试分配的变量
if ((foo = bar()) < 0)
error();
以下哪一种是首选的做事方式,为什么?假设函数 bar() 在任何时候都不取零值,是否有任何特定情况会产生任何影响?
案例1:测试两个条件的真值
if ((foo = bar()) && foo < 0)
error();
案例 2:仅测试分配的变量
if ((foo = bar()) < 0)
error();
首选方法是将它们分开:
foo = bar();
if (foo < 0)
error();
编辑:这是可读性和避免错误的更好方法,例如在您的第一种情况下:
if (foo = bar() && foo < 0)
error();
那应该是:
if ((foo = bar()) && foo < 0)
error();
第一个是完全错误的。由于优先规则,你得到:
if (foo = (bar() && foo < 0))
error();
这通常不是您所期望的。
第一个示例有效,但如果有人试图更改<
为<=
or >=
,它会爆炸:bar
返回 0 时,它将测试 and 语句的第一部分并认为它是假的,中止第二个检查,这应该是真的。
此外,您的第一个示例没有做它应该做的事情:运算符优先级=
小于&&
,因此您将 &&-operation 的结果分配给foo
所以我更喜欢第二个例子。
在大多数情况下,这无关紧要。你的第一个案例有一些冗余,所以我更喜欢第二个简短的建议。
在某些情况下,这种方法不够好,特别是在变量是共享资产的多线程环境中(设置和测试操作在那里很常见)。在这种情况下,需要适当保护对变量的访问(即通过锁定)以避免竞争和数据损坏。
如果您尝试在有条件的额外括号内进行赋值,大多数编译器(如果不是全部)都会发出警告。
但是在大多数情况下,我认为这样的复合语句的可读性较差,虽然在说 Ruby 中它是有意义的,但它在 C 中并不常见。没有一个永远不会通过代码审查 IMO 的理由。