使用 if(...) 时,为啥这被认为是一种好的编程习惯? [复制]

Posted

技术标签:

【中文标题】使用 if(...) 时,为啥这被认为是一种好的编程习惯? [复制]【英文标题】:When using if(...) , why is this considered a good programming practice? [duplicate]使用 if(...) 时,为什么这被认为是一种好的编程习惯? [复制] 【发布时间】:2012-09-24 09:02:02 【问题描述】:

可能重复:How to check for equals? (0 == i) or (i == 0)Is there a difference between i==0 and 0==i?

我多次看到人们使用if(condition) 作为if(0==x) 而不是if(x==0)。据说这是一个很好的做法,但有人可以解释为什么会这样吗?它有什么区别?在我看来,它反而会降低可读性。

【问题讨论】:

试着想象你犯了使用 = 而不是 == 的错误(同时想想你与 0 以外的东西进行比较的情况)。 这不是好的做法,这是恐龙的做法。 1990 年之前编程的人过去常常写这样的代码,认为自己很聪明。 1990 年,Borland 发布了一个编译器,对“可能不正确的赋值”发出警告,从那时起,每个编译器都对此发出警告。编写混淆代码是一个糟糕的解决方案,使用适当的静态检查工具是一个更好的现代想法。 虽然同样值得牢记的是,那些在阅读等式相反的代码时比较困难的人(包括我),并没有正确理解“等式”的含义。因此,0==x 代码仅在读者猜测x==0 代码的程度上被混淆。考虑到人类的阅读速度,这在很大程度上是相当大的,但你希望程序员阅读代码而不是普通文本。 【参考方案1】:

它降低可读性的事实纯粹是主观的。 (虽然我也有同样的感觉,但那是因为我和x==0打交道的次数比其他方式多,所以我习惯了。

这样做是为了防止意外分配:

if(0=x)

会产生编译器错误,

if(x=0)

不会。

【讨论】:

【参考方案2】:

就个人而言,我不喜欢这种做法。但它之所以流行,是因为以下原因:

区分assignment operator 和布尔条件。

if(x = 0)

这行有两个目的:

    将 0 分配给 x。 使条件false 等价于if(0)

为了避免这些错误,有些人更喜欢if(0 = x),这会导致编译时错误。

【讨论】:

【参考方案3】:

它只是避免了输入if (a = 0) 而不是if (a == 0) 的输入错误。使用 Yoda 风格,如果你写的是 if (0 = a) 而不是 if (0 == a),你会得到一个编译错误。

另一方面,它不会阻止if (b = a) 的情况,而b 是另一个变量。没有灵丹妙药。

编译时最好使用-Wall -Wextra。添加-Werror 如果您想偏执并将所有警告视为错误(最好这样做)

【讨论】:

如果b 是一个常数,它会阻止if (b = a)0 是这样的,所以实际上是一样的...... 这个想法是b 应该是另一个变量。现已修复。 是的。 const B b; 是一个 const 变量,if (b=a) 会失败。 :D 是的,但这不是一般情况。这就是我要指出的。【参考方案4】:

是的,它的可读性较差(恕我直言),但这可以避免使用分配的常见错误,而不是检查其==

if( 0 = variable )  // Fail 0 is constant

有趣的事实:有人称之为“尤达条件”

【讨论】:

【参考方案5】:

不,这只是你的习惯,比如左边的变量名和右边的常量。 但实际上它会给你确切的代码,如果你离开

如果 (0=x)

而不是

如果(0==x) 错误地,它会抛出一个错误,你可以轻松修改它,但如果在相反的情况下,它很难调试

【讨论】:

以上是关于使用 if(...) 时,为啥这被认为是一种好的编程习惯? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

始终使用 this 关键字为(自动)属性添加前缀是不是被认为是一种好习惯?

大量使用静态成员变量是一种好习惯吗? [复制]

使用 os.system("bash code") 在 Python 脚本中调用 bash 命令是一种好的风格吗? [关闭]

javascript中的单加运算符[重复]

在 C 中使用第一个数组元素作为数组长度是一种好的编程习惯吗?

在 React 类组件中同时使用继承和组合是一种好的做法吗?