在学习编码时,在检查变量的值时,我学习了以下样式:
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
风格在业内是否被普遍接受和阅读,或者这仅仅是我同事的个人偏好?
答案 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编译器中)。