搜索
bottom↓
回复: 17

一个if条件语句 的表达式计算问题

[复制链接]

出0入0汤圆

发表于 2012-4-22 20:55:28 | 显示全部楼层 |阅读模式
本帖最后由 hkeg8y 于 2012-4-22 21:33 编辑

a[]={0,1,2,3}
为什么if(-1<a[0])的条件为假
而if(-1<0)却为真。
不明白-1<a[0]表达式是怎么计算的



求指点~!!谢谢

  程序和仿真图

我是想设置一个加减计数器,步长、初始值和终止值可设置。
现在程序就是在设置初始值为0的时候。无法从0循环到终止值



#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P1^0;           //轻触开关
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
uint a[]={0,100,200,300,400,500,600,700,800,900,999};   
uint b=0;     //显示数值
uint d=0;
uint n=0;
uint k=0;
uint c=0;  
uint m=0;      
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,           //共阳数码管数值0-9
0x80,0x90

/*0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,           //共阴数码管数值0-9
0x7f,0x6f*/
};
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}


void xianshi()         //计数时数码管显示
{

        P3=0x08;                           //共阴为0 共阳为1
        P2=table[m%10];
        delay(8);
        P3=0x04;       
        P2=table[m%100/10];
        delay(8);
        P3=0x02;       
        P2=table[m%1000/100];
        delay(8);
        P3=0x01;       
        P2=table[n];
        delay(8);
               
}



void xianshi1()         //初始值设置数码管显示
{

        P3=0x08;                           //共阴为0 共阳为1
        P2=table[a[c]%10];
        delay(8);
        P3=0x04;       
        P2=table[a[c]%100/10];
        delay(8);
        P3=0x02;       
        P2=table[a[c]%1000/100];
        delay(8);
        P3=0x01;       
        P2=table[n];
        delay(8);
               
}


void xianshi2()         //步长设置时数码管显示
{

        P3=0x01;       
        P2=table[n];
        delay(8);
               
}

void xianshi3()         //终止值设置时数码管显示
{

        P3=0x08;                           //共阴为0 共阳为1
        P2=table[a[d]%10];
        delay(8);
        P3=0x04;       
        P2=table[a[d]%100/10];
        delay(8);
        P3=0x02;       
        P2=table[a[d]%1000/100];
        delay(8);
        P3=0x01;       
        P2=table[n];
        delay(8);
               
}



//计数
void key0()
{                        xianshi();       
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {        m=m+n;
                        if(m>a[c])
                        m=m-a[c]+a[d];                                       
                        while(!s1);    //等待松开
                }         
         }
        if(s2==0)
        {
                delay(5);
                if(s2==0)
                {
                        m=m-n;
                        if(m<a[d])
                         m=a[c]-a[d]+m;                       
                    while(!s2);    //等待松开               
                 }         
         }
}




//步长设置
void key1()
{                        xianshi2();       
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {        n++;
                        if(n==10)
                        n=0;                                       
                        while(!s1);    //等待松开
                }         
         }
        if(s2==0)
        {
                delay(5);
                if(s2==0)
                {
                        n--;
                        if(n==-1)
                        n=9;                                       
                    while(!s2);    //等待松开               
                 }         
         }
}



//计数器初始值
void key2()
{                        xianshi3();       
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {
                        d++;
                        if(d==11)
                        d=0;
                        m=a[d];                                       
                        while(!s1);    //等待松开

                }         
         }
        if(s2==0)
        {
                delay(5);
                if(s2==0)
                {

                        d--;
                        if(d==-1)
                        d=10;
                    m=a[d];                                       
                        while(!s2);    //等待松开               
                 }         
         }

}


//计数器结束值
void key3()
{                        xianshi1();         
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {
                        c++;
                        if(c==11)
                        c=0;                                       
                        while(!s1);    //等待松开
                       
                }         
         }
        if(s2==0)
        {         
                delay(5);
                if(s2==0)
                {

                        c--;
                        if(c==-1)
                        c=10;                                       
                        while(!s2);    //等待松开       
                       
                 }         
         }

}


void main()
{       
        while(1)
        {                  

            if(s3==0)
            {
                   delay(5);
                   if(s3==0)
                   {
             k++;
                         if(k==4)k=0;
                         while(!s3);
                    }         
             }       

                if(s4==0)
            {
                   delay(5);
                   if(s4==0)
                   {
            m=0;
                        d=0;
                        n=0;
                        c=0         ;
                        k=0;
                        while(!s4) ;
                    }         
             }       
                        
                 switch(k)
                 {
                  case 0:key0();break;
                  case 1:key1();break;
                  case 2:key2();break;
                  case 3:key3();break;
                 }
        }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-4-22 21:07:06 | 显示全部楼层
还是贴源码吧

出0入0汤圆

发表于 2012-4-22 21:47:02 | 显示全部楼层
本帖最后由 y574924080 于 2012-4-22 21:51 编辑

无符号类型整型 与有符号类型整型比较

全都提升为无符号再比较
  1. uint a[]={0,1,2,3};
  2. f(-1<a[0]) // -1 转化为0xfffe
复制代码
  1. if(-1<0)  //这个默认为有符号,编译器判断这个恒为真,优化后,直接执行大括号里的语句
  2. {

  3. }
复制代码

出0入0汤圆

发表于 2012-4-22 23:25:26 | 显示全部楼层
楼上对了... a[]是无符号..

出0入0汤圆

发表于 2012-4-23 08:56:59 | 显示全部楼层
y574924080 是对的.

出0入0汤圆

发表于 2012-4-23 08:57:38 | 显示全部楼层
哈哈,贴出我在VC6.0下运行的结果.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-23 09:02:02 | 显示全部楼层
VC6.0下运行的结果之二.注意unsigned int与unsigned char的区别.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-23 10:32:52 | 显示全部楼层
dragon_hn 发表于 2012-4-23 09:02
VC6.0下运行的结果之二.注意unsigned int与unsigned char的区别.

有啥区别呢?看结果看不懂!

出0入4汤圆

发表于 2012-4-23 11:52:07 | 显示全部楼层
楼主用uint就不能和-1比较了, 搞不好编译器就把-1当做最大的uint.
if(-1<(int)a[0])  强制转换一下.

出0入0汤圆

 楼主| 发表于 2012-4-23 12:41:26 | 显示全部楼层
谢谢各位了。。。学到不少东西

出0入0汤圆

发表于 2012-4-23 12:57:06 | 显示全部楼层
guozaizb 发表于 2012-4-23 10:32
有啥区别呢?看结果看不懂!

这个是规定性的东西,不是看不看得懂的问题,就像是我规定无符号数跟有符号数不能比较,必须统一成一种类型的数

出0入0汤圆

发表于 2012-4-23 13:54:44 | 显示全部楼层
guozaizb 发表于 2012-4-23 10:32
有啥区别呢?看结果看不懂!

在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别

类型级别从高到低的顺序是long double ,double, float,unsigned long long, long long,unsigned long,long,unsigned int,,int。

-------------------------(摘自C Primer Plus      【页数:105】)

还有一些我懒得手打了

搜索一下就可以找到这本书了

里面讲解的很明白了

出0入0汤圆

发表于 2012-4-23 17:49:22 | 显示全部楼层
y574924080 发表于 2012-4-23 13:54
在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别

类型级别从高到低的顺序是long ...

明白了,看来论坛牛人很多呀!!

出0入0汤圆

发表于 2012-4-23 17:57:45 | 显示全部楼层
学习一下呵呵

出0入0汤圆

发表于 2012-4-23 18:28:21 | 显示全部楼层
guozaizb 发表于 2012-4-23 17:49
明白了,看来论坛牛人很多呀!!

不是牛人      

还是新手

只是最近在看C语言

在 C Primer Plus 都讲到这些问题

还有写完程序之后看看对应的汇编就知道它怎么处理了

还有C Primer Plus讲到针对计算机的

不同之处可以看看Keil的用户手册~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-4-24 10:29:13 | 显示全部楼层
新手,楼主贴的程序倒是可以给我借用借用,呵呵

出0入0汤圆

发表于 2012-4-24 10:39:14 | 显示全部楼层
二楼很强大,一语惊醒梦中人啊

出0入0汤圆

发表于 2012-4-26 20:40:10 | 显示全部楼层
guozaizb 发表于 2012-4-23 10:32
有啥区别呢?看结果看不懂!

第一个程序(-1<a[0])为真,第二个程序(-1<a[0])为假.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 21:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表