打印

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

[复制链接]
3116|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,也就是有按键按下

使用特权

评论回复
5
XIEYUANBIN| | 2013-1-4 13:44 | 只看该作者
C中,如果没有括弧,则按照各运算符优先级运算,如果有括弧,则括弧内优先。顺便说一下,上面的表达式中 != 运算符中间不应有空格,有空格就不是这个意思了。

使用特权

评论回复
6
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的话,则表示该位置按键按下了。

使用特权

评论回复
7
cnlgm|  楼主 | 2013-1-4 17:48 | 只看该作者
多谢以上朋友,知道结果但不知流程:
(PORTB & 0x0f)
PORTB=00001111     //PORTB赋初值0x0f
       &=00001111   //PORTB与0x0f按位与 
       00001111   //与结果
      !=11110000     //取反结果
取反后结果不会等于0x0f,那么if表达式不会为真,不是进入if,只能else

使用特权

评论回复
8
cnlgm|  楼主 | 2013-1-4 18:01 | 只看该作者
(PORTB & 0x0F)! = 0x0F:低四位有不为 1 的位
“!真”=假,“!假”=真
(PORTB & 0x0F)是真是假?

使用特权

评论回复
9
vix213| | 2013-1-4 20:02 | 只看该作者
“!=”一起出来时是不等于,你这个取反是从哪来的?
感觉楼主不太了解逻辑运算符。

使用特权

评论回复
10
soul11201| | 2013-1-4 20:37 | 只看该作者
没太理解楼主说什么,if((PORTB & 0x0F)! = 0x0F)这句话的意思是portB与0x0f按位相与,结果不等于0x0f 则进入if体里面的语句。

使用特权

评论回复
11
cnlgm|  楼主 | 2013-1-4 21:07 | 只看该作者
vix213 发表于 2013-1-4 20:02
“!=”一起出来时是不等于,你这个取反是从哪来的?
感觉楼主不太了解逻辑运算符。 ...

这样就明白了,应该好好看看谭教授的C语言。多谢!

使用特权

评论回复
12
明月小厨| | 2013-1-4 22:53 | 只看该作者
if表达式如何运算的?哪个优先级最高?这个问题不能回答你;你的C语言基础几乎是0;

使用特权

评论回复
13
明月小厨| | 2013-1-4 22:55 | 只看该作者
随便借一本最基本的C语言教材也能看明白了;为什么要问?:@:@:@

使用特权

评论回复
14
yewuyi| | 2013-1-5 09:36 | 只看该作者
!=

这是不等于判断,判断表达式两边数值是否相等。

使用特权

评论回复
15
江枫渔火| | 2013-1-5 10:42 | 只看该作者
服了你们了,奔溃的,"!="是不等于的意思,取反用的"!"是放在前面的。
a!=5,意思a不等于5,
!a=5,意思a取反等于5。

使用特权

评论回复
16
chenhao8060| | 2013-1-6 09:42 | 只看该作者
yewuyi 发表于 2013-1-4 15:57
PORTB=0x0F;                                                        //PORTB4~PORTB7输出0,PORTB0~PORT ...

wuyi哥,请教个问题,为什么f不能写成F?貌似0x也不能写成0X,我一直知道有这么回事却不知为啥,翻了很多书也没个结果,特此请教

使用特权

评论回复
17
yewuyi| | 2013-1-6 11:32 | 只看该作者
编译器的规定而已,0x表示后面是16进制,0b表示后面二进制,在PICC里面写成0B或者0X也是可以识别的,但有的编译器则不能识别,为了保持良好的编程风格以及偏于移植,随便无规则的大小写乱用,也不偏于阅读,于是建议统一成小写即可。

使用特权

评论回复
18
chenhao8060| | 2013-1-7 09:25 | 只看该作者
yewuyi 发表于 2013-1-6 11:32
编译器的规定而已,0x表示后面是16进制,0b表示后面二进制,在PICC里面写成0B或者0X也是可以识别的,但有的 ...

多谢wuyi哥指点,我一般都写成0xFF,后面跟大写前面x小写

使用特权

评论回复
19
yewuyi| | 2013-1-7 10:02 | 只看该作者
chenhao8060 发表于 2013-1-7 09:25
多谢wuyi哥指点,我一般都写成0xFF,后面跟大写前面x小写

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

呵呵,你不怕麻烦就这么写吧。

使用特权

评论回复
20
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

粉丝