hkeg8y 发表于 2012-4-22 20:55:28

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

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

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



求指点~!!谢谢

程序和仿真图

我是想设置一个加减计数器,步长、初始值和终止值可设置。
现在程序就是在设置初始值为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;
        delay(8);
        P3=0x04;       
        P2=table;
        delay(8);
        P3=0x02;       
        P2=table;
        delay(8);
        P3=0x01;       
        P2=table;
        delay(8);
               
}



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

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


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

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

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

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



//计数
void key0()
{                        xianshi();       
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {        m=m+n;
                        if(m>a)
                        m=m-a+a;                                       
                        while(!s1);    //等待松开
                }       
       }
        if(s2==0)
        {
                delay(5);
                if(s2==0)
                {
                        m=m-n;
                        if(m<a)
                       m=a-a+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;                                       
                        while(!s1);    //等待松开

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

                        d--;
                        if(d==-1)
                        d=10;
                  m=a;                                       
                        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;
               }
        }
}

usingavr 发表于 2012-4-22 21:07:06

还是贴源码吧{:titter:}

y574924080 发表于 2012-4-22 21:47:02

本帖最后由 y574924080 于 2012-4-22 21:51 编辑

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

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

}

kayatsl 发表于 2012-4-22 23:25:26

楼上对了... a[]是无符号..

lryxr2507 发表于 2012-4-23 08:56:59

y574924080 是对的.

dragon_hn 发表于 2012-4-23 08:57:38

哈哈,贴出我在VC6.0下运行的结果.

dragon_hn 发表于 2012-4-23 09:02:02

VC6.0下运行的结果之二.注意unsigned int与unsigned char的区别.

guozaizb 发表于 2012-4-23 10:32:52

dragon_hn 发表于 2012-4-23 09:02 static/image/common/back.gif
VC6.0下运行的结果之二.注意unsigned int与unsigned char的区别.

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

qinxg 发表于 2012-4-23 11:52:07

楼主用uint就不能和-1比较了, 搞不好编译器就把-1当做最大的uint.
if(-1<(int)a)强制转换一下.

hkeg8y 发表于 2012-4-23 12:41:26

谢谢各位了。。。学到不少东西{:biggrin:}

zjk 发表于 2012-4-23 12:57:06

guozaizb 发表于 2012-4-23 10:32 static/image/common/back.gif
有啥区别呢?看结果看不懂!

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

y574924080 发表于 2012-4-23 13:54:44

guozaizb 发表于 2012-4-23 10:32 static/image/common/back.gif
有啥区别呢?看结果看不懂!

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

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

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

还有一些我懒得手打了

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

里面讲解的很明白了

guozaizb 发表于 2012-4-23 17:49:22

y574924080 发表于 2012-4-23 13:54 static/image/common/back.gif
在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别

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

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

唯诚hhw2 发表于 2012-4-23 17:57:45

学习一下呵呵

y574924080 发表于 2012-4-23 18:28:21

guozaizb 发表于 2012-4-23 17:49 static/image/common/back.gif
明白了,看来论坛牛人很多呀!!

不是牛人       {:sweat:}

还是新手

只是最近在看C语言

在 C Primer Plus 都讲到这些问题

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

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

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

xiongpeiyong888 发表于 2012-4-24 10:29:13

新手,楼主贴的程序倒是可以给我借用借用,呵呵

comeday 发表于 2012-4-24 10:39:14

二楼很强大,一语惊醒梦中人啊

dragon_hn 发表于 2012-4-26 20:40:10

guozaizb 发表于 2012-4-23 10:32 static/image/common/back.gif
有啥区别呢?看结果看不懂!

第一个程序(-1<a)为真,第二个程序(-1<a)为假.
页: [1]
查看完整版本: 一个if条件语句 的表达式计算问题