在if语句中加入长条件并不是一个好习惯,如
if(((FIO2PIN & 0x00001000)>>12))
哪个结果在ARM7结尾为0/1?
这样我只能在if条件下检查0或1吗?
例如
if(x!=0)
或
if(x==1)??
间接(FIO2PIN & 0x00001000)>>12
也会在结尾给出一些值,可能是0/1,具体取决于FIO2PIN状态吗?
答案 0 :(得分:1)
表达式((FIO2PIN & 0x00001000)>>12)
是一个整数表达式,由if(...)
隐式强制转换为布尔值,其中0为 false ,非零为 true < / em>的。
就编译器和语言定义而言,它是完全明确的,没有任何错误,但我更喜欢在条件语句中只使用显式的布尔表达式 - 以便使程序员的意图明确。这可以通过明确地将结果与零进行比较来轻松完成;在这种情况下:
if( ((FIO2PIN & 0x00001000) >> 12) != 0 )
然而,在任何一种情况下,转换都是完全没有必要的,因为任何非零值都将被接受为 true (这就是为什么你应该总是与零比较 - 或者根本没有比较)。所以:
if( FIO2PIN & 0x00001000 )
或
if( (FIO2PIN & 0x00001000) != 0 )
同样有效 - 后者是我的偏好。
如上所述,任何非零值都将被接受为true,而只有零是false,因此x
是一个整数表达式,测试x == 1
是一个危险的,你应该使用而是x != 0
。
答案 1 :(得分:0)
如果表达式非零,则if语句将为true。因此,在您的示例中,不需要向右移12位。因为((FIO2PIN&amp; 0x00001000)&gt;&gt; 12)非零,因此(FIO2PIN&amp; 0x00001000)非零。换句话说,哪个位非零是无关紧要的。如果任何位非零,则if语句将测试为真。
在我看来,如果表达式如此复杂以至于开发人员难以理解或维护,那么在if语句中使用复杂表达式可能是不好的做法。但是否则,只要表达式是正确的,那么编译器应该对它进行排序,你不必担心编译器是否太复杂。