在C中,在' if'声明,为什么反转测试常数和变量,例如, if(10 == val){}?

时间:2016-01-27 14:19:22

标签: c gcc compiler-optimization

在C语言中,对于if语句,有时我们可以看到测试值放在要测试的变量之前,这可能会带来一些优化(GCC编译器),但是哪一个? (但这会降低我认为的可读性。)

示例:

if ( 10 == val) {}

谢谢,

2 个答案:

答案 0 :(得分:5)

它与优化无关,它是一种用于避免意外分配的技巧,它被称为Yoda Convention or Yoda Conditions。它可以防止意外分配,因为

if (value = 10)
如果你的意思是value,虽然有些编译器会对此发出警告并提出额外的括号以避免歧义

em>),这个

if (value == 10)

不会。

由于编译器可以发出警告,并且当您有经验时,这是一个非常罕见的错误,我会建议不要这样做。因为它很难阅读而且感觉不自然。所以要小心并使用正常条件,如

if (10 = value)

并且为了安全起见,请在编译器中启用警告以防止意外分配。看到这相当于像Yoda,like in this comment一样说话,你可以看到为什么在自然语言中这是不舒服的,它在代码中也是如此。

答案 1 :(得分:2)

原始的历史原因是对古老的经典错误的恐惧,你会混淆=和==运算符。

当恐龙走向地球而C是一种新语言时,来自其他语言的程序员,尤其是Pascal,特别容易写出这个bug。因为在Pascal中,比较是由=而不是==完成的。

为了避免这个错误,一些更混乱的恐龙因此发明了这种特殊的编码风格。因为if(10 = val)无法编译。这个技巧被非正式地称为" Yoda条件",在使用向后,混淆语言语法的星球大战角色之后。

然后在1989年左右,Borland想出了一个解决这个问题的智能解决方案:让编程器警告可能在内部条件下进行错误的分配,而不是让程序员让他们的程序变得不可读!这是" Yoda条件的结束"自Turbo C发布以来,每一个体面的编译器都支持对这种意外分配的警告。

如果你今天遇到某个人,他仍然认为这个技巧很聪明,你就会知道他们要么是活着的恐龙,要么就是绝地大师尤达。无论哪种情况,您都不应该从他们那里获取任何C编程建议。但你可以问他们为什么他们坚持使用比1989年的Turbo C更差的编译器。