标题: 关于C语言--b的问题 [打印本页]

作者: zhuwushi    时间: 2018-1-28 13:09
标题: 关于C语言--b的问题
#include"reg52.h"
#include"intrins.h"
#define led P2
typedef unsigned char u8;
typedef unsigned int u16;
u8 b=2,c=1;                                 

void delay(u16 i)               
{
        while(i--);
}

void main()
{
        u8 a;
        led=0xfe;
        delay(65535);
        while(c>0)                        
        {
                c=--b;                             
                for(a=0;a<7;a++)           
                {        
                        led=_crol_(led,1);
                        delay(65535);
                }
                for(a=0;a<7;a++)
                {
                        led=_cror_(led,1);
                        delay(65535);
                }
        }
}

求大神指c=--b,b自减为1,赋值给c,循环一次,b再自减为0,赋值给c,不是应该循环两次吗,为什么无限次循环
作者: qq1105424012    时间: 2018-1-28 14:32
感觉B=B-- 也是一样的效果啊
作者: cccc888    时间: 2018-1-28 14:36
根据第六行u8 b=2; b=b--,等效为b=2,
IEEE标准过程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

在非标准编译器中可能有不能的行为。

作者: zhuwushi    时间: 2018-1-28 15:49
cccc888 发表于 2018-1-28 14:36
根据第六行u8 b=2; b=b--,等效为b=2,
IEEE标准过程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

就是说b一直都为原来的值,谢谢,那为什么c=--b也是无限循环啊
作者: zhuwushi    时间: 2018-1-28 15:51
qq1105424012 发表于 2018-1-28 14:32
感觉B=B-- 也是一样的效果啊

b=--b的话只循环两次,b=b--的话就无限循环了
作者: wulin    时间: 2018-1-28 16:59
你理解是对的, while(c>0)花括号里内容只能循环两次,程序结束,但可以再次进入main(), b、c都被初始化,所以目测感觉在无限循环。把程序略改一下就可以验证:

#include"reg52.h"
#include"intrins.h"
#define led P2
typedef unsigned char u8;
typedef unsigned int u16;
u8 b=2,c=1;                                 

void delay(u16 i)               
{
         while(i--);
}

void main()
{
        u8 a;
        led=0x00;        //加一条全亮语句,可以看到反复被执行。
        delay(65535);
        led=0xfe;
        delay(65535);
        while(c>0)                        
        {
                c=--b;                             
                for(a=0;a<7;a++)           
                {        
                        led=_crol_(led,1);
                        delay(65535);
                }
                for(a=0;a<7;a++)
                {
                        led=_cror_(led,1);
                        delay(65535);
                }
        }
}

作者: zhuwushi    时间: 2018-1-28 17:55
wulin 发表于 2018-1-28 16:59
你理解是对的, while(c>0)花括号里内容只能循环两次,程序结束,但可以再次进入main(), b、c都被初始化, ...

谢谢大神,但是为什么我把c=--b改成c=b--就执行三次就结束了,不会被初始化呢
作者: ahshmj    时间: 2018-1-28 20:12
一个是先减后赋值,一个是先赋值后减。
作者: wulin    时间: 2018-1-28 20:59
zhuwushi 发表于 2018-1-28 17:55
谢谢大神,但是为什么我把c=--b改成c=b--就执行三次就结束了,不会被初始化呢

--b;和b--;单独使用没有区别,如用于赋值或运算是不一样的。
c=--b;为b先自减1后再赋值,此时c=1,b=1。
c=b--;为b先赋值后再自减1,此时c=2,b=1。
所以while(c>0)花括号内容执行3次。


作者: zhuwushi    时间: 2018-1-31 16:38
wulin 发表于 2018-1-28 20:59
--b;和b--;单独使用没有区别,如用于赋值或运算是不一样的。
c=--b;为b先自减1后再赋值,此时c=1,b=1。 ...

是后赋值的会初始化,先赋值再自减的不会再初始化的意思吗
作者: wulin    时间: 2018-1-31 21:19
zhuwushi 发表于 2018-1-31 16:38
是后赋值的会初始化,先赋值再自减的不会再初始化的意思吗

你这样理解是错误的。在这个程序中写c=--b;或c=b--;只会影响while(c>0)花括号内容循环2此或3次,与变量初始化没有直接关系。我前述所说的初始化是指while(c>0)花括号内容循环2次以后main函数运行结束,如果能够再次进入main函数运行就会初始化b、c。由于这个程序写得不规范,通常main函数里都会用while(1),保证程序永远在其内循环,除了断电不会结束。没有任何资料说明main函数运行结束肯定会再次重新开始执行main函数,据说就这个问题不同的编译器可能会有不同的结果。我前述回答你的提问是把你的程序在Keil uVision2编译环境的调试状态确认的,并不能代表其它编译环境也得到这样的结果。
作者: wulin    时间: 2018-1-31 21:23
zhuwushi 发表于 2018-1-31 16:38
是后赋值的会初始化,先赋值再自减的不会再初始化的意思吗

你可以把这个程序在编译器的调试状态单步运行查看运行状态。
作者: 无线电菜虫    时间: 2018-2-3 10:42
main函数结束后的执行过程是未定义的
作者: wannenggong    时间: 2018-2-3 14:36
理论计算与分步调试都可以看到结果如下:
c=b--;时算式为c=b-1,运行步骤为1.赋值后进行减一操作。结果为c=2;b=1;步骤2.再次赋值和减一操作。结果为c=1;b=0;步骤3.重复上述操作。c=0;b=0xff;第4次直接跳出循环了。
c=--b;时,算式为c=c-b=1-2;经过一次循环后就变成了c=0xff-2,经过128次以后应该也能跳出循环。
作者: 17089306679    时间: 2018-2-4 17:30
b=-b的话只循环两次,b=b--的话就无限循环了
作者: zhuwushi    时间: 2018-2-8 19:26
wulin 发表于 2018-1-31 21:19
你这样理解是错误的。在这个程序中写c=--b;或c=b--;只会影响while(c>0)花括号内容循环2此或3次,与变量初 ...

好的谢谢
作者: zhuwushi    时间: 2018-2-8 21:27
无线电菜虫 发表于 2018-2-3 10:42
main函数结束后的执行过程是未定义的

好的了解
作者: ming7511199    时间: 2018-2-9 08:35

根据第六行u8 b=2; b=b--,等效为b=2,
IEEE标准过程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

在非标准编译器中可能有不能的行为。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1