3

在学习编码时,我在检查变量的值时被教导以下风格:

int x;
Object *object;
...
if(x == 7) { ... }
if(object == NULL) { ... }

然而,现在我在这个领域,我遇到过不止一位同事发誓要在if语句中切换 lhs 和 rhs 的方法:

if(7 == x) { ... }
if(NULL == object) { ... }

原因是,如果您不小心键入=而不是==,那么代码将在编译时失败。由于不习惯这种风格,阅读7 == x对我来说很困难,减慢了我对他们代码的理解。

看来如果我采用这种风格,我可能会在未来的某一天免于调试x = 7错误,但同时,每次有人阅读我的代码时,我可能是在浪费他们的时间,因为我担心语法不正统。

这种7 == x风格在行业中是否普遍接受和可读,或者这只是我同事的个人喜好?

4

1 回答 1

2

原因是如果您不小心键入 = 而不是 ==,那么代码将在编译时失败。

真的。另一方面,我相信现代C 和 C++ 编译器(我假设您正在使用其中一种语言?您还没有说过)如果您这样做,会警告您。

你用你正在使用的编译器试过吗?如果默认情况下它不这样做,请查看是否有可以用来引发它的标志 - 理想情况下使其成为错误而不仅仅是警告。

例如,使用 Microsoft C 编译器,我得到:

cl /Wall Test.c
test.c(3) : warning C4706: assignment within conditional expression

这很清楚,IMO。(不可否认,默认警告设置不会发现它。)

由于不习惯这种风格,阅读 7 == x 对我来说很困难,这会减慢我对他们代码的理解。

确实。你的方法是更自然的风格,应该使用(IMO),除非你真的在处理一个没有发现这是一个潜在问题的编译器(并且你别无选择使用那个编译器)。

编辑:请注意,这在所有语言中都不是问题——甚至不是所有类 C 语言。

例如,尽管 Java 和 C# 都有类似的if构造,但两者中的条件表达式都需要隐式转换为布尔值。虽然赋值部分可以编译,但第一个示例中的表达式类型是int,它不能隐式转换为任何一种语言的相关布尔类型,从而导致编译时错误。您仍然遇到问题的罕见情况是:

if (foo == true)

其中,如果错字:

if (foo = true)

会编译并做错事。MS C# 编译器甚至会警告您,尽管通常最好只使用

if (foo)

或者

if (!foo)

在可能的情况。剩下的就是:

if (x == MethodReturningBool())

对比

if (MethodReturningBool() == x)

which is still pretty rare, and there's still a warning for it in the MS C# compiler (and probably in some Java compilers).

于 2012-08-15T21:06:46.293 回答