5

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

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

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

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

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

5 回答 5

14

首选方法是将它们分开:

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

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

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

那应该是:

if ((foo = bar()) && foo < 0)
    error();
于 2012-11-01T11:55:10.070 回答
2

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

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

这通常不是您所期望的。

于 2012-11-01T11:57:02.010 回答
0

第一个示例有效,但如果有人试图更改<<=or >=,它会爆炸:bar返回 0 时,它将测试 and 语句的第一部分并认为它是假的,中止第二个检查,这应该是真的。

此外,您的第一个示例没有做它应该做的事情:运算符优先级=小于&&,因此您将 &&-operation 的结果分配给foo

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

于 2012-11-01T11:57:05.230 回答
0

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

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

于 2012-11-01T11:59:39.423 回答
0

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

但是在大多数情况下,我认为这样的复合语句的可读性较差,虽然在说 Ruby 中它是有意义的,但它在 C 中并不常见。没有一个永远不会通过代码审查 IMO 的理由。

于 2012-11-01T12:05:37.113 回答