关于ARM 7中的if(条件)

时间:2013-07-20 07:21:29

标签: embedded arm keil arm7

在if语句中加入长条件并不是一个好习惯,如

if(((FIO2PIN & 0x00001000)>>12))

哪个结果在ARM7结尾为0/1?

这样我只能在if条件下检查0或1吗?

例如

if(x!=0)

if(x==1)??

间接(FIO2PIN & 0x00001000)>>12也会在结尾给出一些值,可能是0/1,具体取决于FIO2PIN状态吗?

2 个答案:

答案 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语句中使用复杂表达式可能是不好的做法。但是否则,只要表达式是正确的,那么编译器应该对它进行排序,你不必担心编译器是否太复杂。