原因是如果您不小心键入 = 而不是 ==,那么代码将在编译时失败。
真的。另一方面,我相信现代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).