在 if 语句中放置长条件不是一个好习惯吗
if(((FIO2PIN & 0x00001000)>>12))
在 ARM7 中最后会给出 0/1 的结果吗?
是这样我只能在 if 条件下检查 0 或 1 吗?
例如
if(x!=0)
或者
if(x==1)??
间接 (FIO2PIN & 0x00001000)>>12
也会在最后给出一些值,这可能是 0/1,具体取决于 FIO2PIN 状态,对吧?
该表达式((FIO2PIN & 0x00001000)>>12)
是一个整数表达式,并由 隐式转换为布尔值if(...)
,其中零为假,非零为真。
从某种意义上说,就编译器和语言定义而言,它是完全明确的,这并没有错,但我更喜欢在条件语句中仅使用显式布尔表达式——以便使程序员的意图清晰。这很容易通过明确地将结果与零进行比较来完成;在这种情况下:
if( ((FIO2PIN & 0x00001000) >> 12) != 0 )
但是,在任何一种情况下,这种转变都是完全没有必要的,因为任何非零值都将被接受为真(这就是为什么您应该始终与零进行比较 - 或者根本不进行比较)。所以:
if( FIO2PIN & 0x00001000 )
或者
if( (FIO2PIN & 0x00001000) != 0 )
同样有效——后者是我的偏好。
如前所述,任何非零值都将被接受为真,而只有零是假,所以x
整数表达式在哪里,测试x == 1
是危险的,你应该使用它x != 0
。
如果表达式非零,则 if 语句为真。因此,在您的示例中,不需要右移 12 位。因为只要 ((FIO2PIN & 0x00001000) >> 12) 非零, (FIO2PIN & 0x00001000) 就非零。换句话说,哪个位非零并不重要。如果任何位非零,if 语句将测试为真。
在我看来,如果表达式过于复杂以至于开发人员难以理解或维护,那么在 if 语句中使用复杂表达式可能是不好的做法。但除此之外,只要表达式是正确的,那么编译器就应该对其进行排序,您不必担心它是否对编译器来说过于复杂。