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

2020-02-04 09:05发布

本帖最后由 hkeg8y 于 2012-4-22 21:33 编辑

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



求指点~!!谢谢

仿真.rar (52.32 KB, 下载次数: 1) 2012-4-22 21:27 上传 点击文件名下载附件
程序和仿真
  程序和仿真图

我是想设置一个加减计数器,步长、初始值和终止值可设置。
现在程序就是在设置初始值为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;
                 }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
usingavr
1楼-- · 2020-02-04 14:03
还是贴源码吧
y574924080
2楼-- · 2020-02-04 18:35
本帖最后由 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. }
复制代码
kayatsl
3楼-- · 2020-02-04 23:19
 精彩回答 2  元偷偷看……
lryxr2507
4楼-- · 2020-02-05 01:48
y574924080 是对的.
dragon_hn
5楼-- · 2020-02-05 06:31
哈哈,贴出我在VC6.0下运行的结果.

test.GIF (19.48 KB, 下载次数: 0)

下载附件

2012-4-23 08:56 上传


dragon_hn
6楼-- · 2020-02-05 07:13
VC6.0下运行的结果之二.注意unsigned int与unsigned char的区别.

test2.GIF (14.34 KB, 下载次数: 0)

下载附件

2012-4-23 09:00 上传

一周热门 更多>