找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2353|回复: 17
打印 上一主题 下一主题
收起左侧

关于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,不是应该循环两次吗,为什么无限次循环
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:84283 发表于 2018-1-28 14:32 | 只看该作者
感觉B=B-- 也是一样的效果啊
回复

使用道具 举报

板凳
ID:258566 发表于 2018-1-28 14:36 | 只看该作者
根据第六行u8 b=2; b=b--,等效为b=2,
IEEE标准过程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

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

使用道具 举报

地板
ID:270522 发表于 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也是无限循环啊
回复

使用道具 举报

5#
ID:270522 发表于 2018-1-28 15:51 | 只看该作者
qq1105424012 发表于 2018-1-28 14:32
感觉B=B-- 也是一样的效果啊

b=--b的话只循环两次,b=b--的话就无限循环了
回复

使用道具 举报

6#
ID:213173 发表于 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);
                }
        }
}
回复

使用道具 举报

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

谢谢大神,但是为什么我把c=--b改成c=b--就执行三次就结束了,不会被初始化呢
回复

使用道具 举报

8#
ID:7485 发表于 2018-1-28 20:12 | 只看该作者
一个是先减后赋值,一个是先赋值后减。
回复

使用道具 举报

9#
ID:213173 发表于 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次。

回复

使用道具 举报

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

是后赋值的会初始化,先赋值再自减的不会再初始化的意思吗
回复

使用道具 举报

11#
ID:213173 发表于 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编译环境的调试状态确认的,并不能代表其它编译环境也得到这样的结果。
回复

使用道具 举报

12#
ID:213173 发表于 2018-1-31 21:23 | 只看该作者
zhuwushi 发表于 2018-1-31 16:38
是后赋值的会初始化,先赋值再自减的不会再初始化的意思吗

你可以把这个程序在编译器的调试状态单步运行查看运行状态。
回复

使用道具 举报

13#
ID:232585 发表于 2018-2-3 10:42 | 只看该作者
main函数结束后的执行过程是未定义的
回复

使用道具 举报

14#
ID:281828 发表于 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次以后应该也能跳出循环。
回复

使用道具 举报

15#
ID:282046 发表于 2018-2-4 17:30 来自手机 | 只看该作者
b=-b的话只循环两次,b=b--的话就无限循环了
回复

使用道具 举报

16#
ID:270522 发表于 2018-2-8 19:26 | 只看该作者
wulin 发表于 2018-1-31 21:19
你这样理解是错误的。在这个程序中写c=--b;或c=b--;只会影响while(c>0)花括号内容循环2此或3次,与变量初 ...

好的谢谢
回复

使用道具 举报

17#
ID:270522 发表于 2018-2-8 21:27 | 只看该作者
无线电菜虫 发表于 2018-2-3 10:42
main函数结束后的执行过程是未定义的

好的了解
回复

使用道具 举报

18#
ID:283238 发表于 2018-2-9 08:35 | 只看该作者

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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