有请C高手,一个表达式解疑答惑,请赐教!

[复制链接]
3930|20
 楼主| cnlgm 发表于 2013-1-4 11:22 | 显示全部楼层 |阅读模式
4X4矩阵键盘检测,RB0-RB3(设置输入检测)列线,RB4-RB7(设置输出0)行线。
void keyscan()
{
        PORTB=0x0F;                        //RB端口赋值
        if((PORTB & 0x0F)! = 0x0F)     //判断是否有键按下,如果不等于0x0F,则表示有键按下

        {
         ............
        }
        else
        {
        ...............
        }
}
if表达式如何运算的?哪个优先级最高?如果进入if体等于0x0F?如果进入else体不等于0x0F?
 楼主| cnlgm 发表于 2013-1-4 11:27 | 显示全部楼层
if中的表达式应该如何理解?先按位与然后取反然后判断是否等于0x0F?但这样显然是不对的!
 楼主| cnlgm 发表于 2013-1-4 11:31 | 显示全部楼层
if表达式的逻辑关系应该如何理解?
vix213 发表于 2013-1-4 12:28 | 显示全部楼层
PORTB & 0x0F  :高四位(RB4-RB7)清零
(PORTB & 0x0F)! = 0x0F:低四位有不为 1 的位
if((PORTB & 0x0F)! = 0x0F):如果低四位不全为1,也就是有按键按下
XIEYUANBIN 发表于 2013-1-4 13:44 | 显示全部楼层
C中,如果没有括弧,则按照各运算符优先级运算,如果有括弧,则括弧内优先。顺便说一下,上面的表达式中 != 运算符中间不应有空格,有空格就不是这个意思了。
yewuyi 发表于 2013-1-4 15:57 | 显示全部楼层
PORTB=0x0F;                                                        //PORTB4~PORTB7输出0,PORTB0~PORTB3输出1//
TRISB=0x0f;                           // 建议后面加上一句 这样最保险
if((PORTB & 0x0f) != 0x0f)                                     //f不要随便写成F,这句的意思就是如果PORTB0~PORTB3不等于1的话,则表示该位置按键按下了。
 楼主| cnlgm 发表于 2013-1-4 17:48 | 显示全部楼层
多谢以上朋友,知道结果但不知流程:
(PORTB & 0x0f)
PORTB=00001111     //PORTB赋初值0x0f
       &=00001111   //PORTB与0x0f按位与 
       00001111   //与结果
      !=11110000     //取反结果
取反后结果不会等于0x0f,那么if表达式不会为真,不是进入if,只能else
 楼主| cnlgm 发表于 2013-1-4 18:01 | 显示全部楼层
(PORTB & 0x0F)! = 0x0F:低四位有不为 1 的位
“!真”=假,“!假”=真
(PORTB & 0x0F)是真是假?
vix213 发表于 2013-1-4 20:02 | 显示全部楼层
“!=”一起出来时是不等于,你这个取反是从哪来的?
感觉楼主不太了解逻辑运算符。
soul11201 发表于 2013-1-4 20:37 | 显示全部楼层
没太理解楼主说什么,if((PORTB & 0x0F)! = 0x0F)这句话的意思是portB与0x0f按位相与,结果不等于0x0f 则进入if体里面的语句。
 楼主| cnlgm 发表于 2013-1-4 21:07 | 显示全部楼层
vix213 发表于 2013-1-4 20:02
“!=”一起出来时是不等于,你这个取反是从哪来的?
感觉楼主不太了解逻辑运算符。 ...

这样就明白了,应该好好看看谭教授的C语言。多谢!
明月小厨 发表于 2013-1-4 22:53 | 显示全部楼层
if表达式如何运算的?哪个优先级最高?这个问题不能回答你;你的C语言基础几乎是0;
明月小厨 发表于 2013-1-4 22:55 | 显示全部楼层
随便借一本最基本的C语言教材也能看明白了;为什么要问?:@:@:@
yewuyi 发表于 2013-1-5 09:36 | 显示全部楼层
!=

这是不等于判断,判断表达式两边数值是否相等。
江枫渔火 发表于 2013-1-5 10:42 | 显示全部楼层
服了你们了,奔溃的,"!="是不等于的意思,取反用的"!"是放在前面的。
a!=5,意思a不等于5,
!a=5,意思a取反等于5。
chenhao8060 发表于 2013-1-6 09:42 | 显示全部楼层
yewuyi 发表于 2013-1-4 15:57
PORTB=0x0F;                                                        //PORTB4~PORTB7输出0,PORTB0~PORT ...

wuyi哥,请教个问题,为什么f不能写成F?貌似0x也不能写成0X,我一直知道有这么回事却不知为啥,翻了很多书也没个结果,特此请教
yewuyi 发表于 2013-1-6 11:32 | 显示全部楼层
编译器的规定而已,0x表示后面是16进制,0b表示后面二进制,在PICC里面写成0B或者0X也是可以识别的,但有的编译器则不能识别,为了保持良好的编程风格以及偏于移植,随便无规则的大小写乱用,也不偏于阅读,于是建议统一成小写即可。
chenhao8060 发表于 2013-1-7 09:25 | 显示全部楼层
yewuyi 发表于 2013-1-6 11:32
编译器的规定而已,0x表示后面是16进制,0b表示后面二进制,在PICC里面写成0B或者0X也是可以识别的,但有的 ...

多谢wuyi哥指点,我一般都写成0xFF,后面跟大写前面x小写
yewuyi 发表于 2013-1-7 10:02 | 显示全部楼层
chenhao8060 发表于 2013-1-7 09:25
多谢wuyi哥指点,我一般都写成0xFF,后面跟大写前面x小写

写一个数字还要切换两次CapsLK岂不是很麻烦?

呵呵,你不怕麻烦就这么写吧。
mcu818 发表于 2013-1-7 14:42 | 显示全部楼层
江枫渔火 发表于 2013-1-5 10:42
服了你们了,奔溃的,"!="是不等于的意思,取反用的"!"是放在前面的。
a!=5,意思a不等于5,
!a=5,意思a取反 ...

a != 5
!a == 5
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

90

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部