将变量与文字进行比较时,应该将文字放在等于“=”的左侧或右侧。运营商?

时间:2012-08-15 21:01:51

标签: coding-style

在学习编码时,在检查变量的值时,我学习了以下样式:

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风格在业内是否被普遍接受和阅读,或者这仅仅是我同事的个人偏好?

1 个答案:

答案 0 :(得分: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())

VS

if (MethodReturningBool() == x)

这仍然非常罕见,并且在MS C#编译器中仍然存在警告(可能在某些Java编译器中)。