找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2924|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

關(guān)于C語言--b的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#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,循環(huán)一次,b再自減為0,賦值給c,不是應(yīng)該循環(huán)兩次嗎,為什么無限次循環(huán)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:84283 發(fā)表于 2018-1-28 14:32 | 只看該作者
感覺B=B-- 也是一樣的效果啊
回復(fù)

使用道具 舉報

板凳
ID:258566 發(fā)表于 2018-1-28 14:36 | 只看該作者
根據(jù)第六行u8 b=2; b=b--,等效為b=2,
IEEE標(biāo)準(zhǔn)過程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

在非標(biāo)準(zhǔn)編譯器中可能有不能的行為。
回復(fù)

使用道具 舉報

地板
ID:270522 發(fā)表于 2018-1-28 15:49 | 只看該作者
cccc888 發(fā)表于 2018-1-28 14:36
根據(jù)第六行u8 b=2; b=b--,等效為b=2,
IEEE標(biāo)準(zhǔn)過程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

就是說b一直都為原來的值,謝謝,那為什么c=--b也是無限循環(huán)啊
回復(fù)

使用道具 舉報

5#
ID:270522 發(fā)表于 2018-1-28 15:51 | 只看該作者
qq1105424012 發(fā)表于 2018-1-28 14:32
感覺B=B-- 也是一樣的效果啊

b=--b的話只循環(huán)兩次,b=b--的話就無限循環(huán)了
回復(fù)

使用道具 舉報

6#
ID:213173 發(fā)表于 2018-1-28 16:59 | 只看該作者
你理解是對的, while(c>0)花括號里內(nèi)容只能循環(huán)兩次,程序結(jié)束,但可以再次進(jìn)入main(), b、c都被初始化,所以目測感覺在無限循環(huán)。把程序略改一下就可以驗(yàn)證:

#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;        //加一條全亮語句,可以看到反復(fù)被執(zhí)行。
        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);
                }
        }
}
回復(fù)

使用道具 舉報

7#
ID:270522 發(fā)表于 2018-1-28 17:55 | 只看該作者
wulin 發(fā)表于 2018-1-28 16:59
你理解是對的, while(c>0)花括號里內(nèi)容只能循環(huán)兩次,程序結(jié)束,但可以再次進(jìn)入main(), b、c都被初始化, ...

謝謝大神,但是為什么我把c=--b改成c=b--就執(zhí)行三次就結(jié)束了,不會被初始化呢
回復(fù)

使用道具 舉報

8#
ID:7485 發(fā)表于 2018-1-28 20:12 | 只看該作者
一個是先減后賦值,一個是先賦值后減。
回復(fù)

使用道具 舉報

9#
ID:213173 發(fā)表于 2018-1-28 20:59 | 只看該作者
zhuwushi 發(fā)表于 2018-1-28 17:55
謝謝大神,但是為什么我把c=--b改成c=b--就執(zhí)行三次就結(jié)束了,不會被初始化呢

--b;和b--;單獨(dú)使用沒有區(qū)別,如用于賦值或運(yùn)算是不一樣的。
c=--b;為b先自減1后再賦值,此時c=1,b=1。
c=b--;為b先賦值后再自減1,此時c=2,b=1。
所以while(c>0)花括號內(nèi)容執(zhí)行3次。

回復(fù)

使用道具 舉報

10#
ID:270522 發(fā)表于 2018-1-31 16:38 | 只看該作者
wulin 發(fā)表于 2018-1-28 20:59
--b;和b--;單獨(dú)使用沒有區(qū)別,如用于賦值或運(yùn)算是不一樣的。
c=--b;為b先自減1后再賦值,此時c=1,b=1。 ...

是后賦值的會初始化,先賦值再自減的不會再初始化的意思嗎
回復(fù)

使用道具 舉報

11#
ID:213173 發(fā)表于 2018-1-31 21:19 | 只看該作者
zhuwushi 發(fā)表于 2018-1-31 16:38
是后賦值的會初始化,先賦值再自減的不會再初始化的意思嗎

你這樣理解是錯誤的。在這個程序中寫c=--b;或c=b--;只會影響while(c>0)花括號內(nèi)容循環(huán)2此或3次,與變量初始化沒有直接關(guān)系。我前述所說的初始化是指while(c>0)花括號內(nèi)容循環(huán)2次以后main函數(shù)運(yùn)行結(jié)束,如果能夠再次進(jìn)入main函數(shù)運(yùn)行就會初始化b、c。由于這個程序?qū)懙貌灰?guī)范,通常main函數(shù)里都會用while(1),保證程序永遠(yuǎn)在其內(nèi)循環(huán),除了斷電不會結(jié)束。沒有任何資料說明main函數(shù)運(yùn)行結(jié)束肯定會再次重新開始執(zhí)行main函數(shù),據(jù)說就這個問題不同的編譯器可能會有不同的結(jié)果。我前述回答你的提問是把你的程序在Keil uVision2編譯環(huán)境的調(diào)試狀態(tài)確認(rèn)的,并不能代表其它編譯環(huán)境也得到這樣的結(jié)果。
回復(fù)

使用道具 舉報

12#
ID:213173 發(fā)表于 2018-1-31 21:23 | 只看該作者
zhuwushi 發(fā)表于 2018-1-31 16:38
是后賦值的會初始化,先賦值再自減的不會再初始化的意思嗎

你可以把這個程序在編譯器的調(diào)試狀態(tài)單步運(yùn)行查看運(yùn)行狀態(tài)。
回復(fù)

使用道具 舉報

13#
ID:232585 發(fā)表于 2018-2-3 10:42 | 只看該作者
main函數(shù)結(jié)束后的執(zhí)行過程是未定義的
回復(fù)

使用道具 舉報

14#
ID:281828 發(fā)表于 2018-2-3 14:36 | 只看該作者
理論計算與分步調(diào)試都可以看到結(jié)果如下:
c=b--;時算式為c=b-1,運(yùn)行步驟為1.賦值后進(jìn)行減一操作。結(jié)果為c=2;b=1;步驟2.再次賦值和減一操作。結(jié)果為c=1;b=0;步驟3.重復(fù)上述操作。c=0;b=0xff;第4次直接跳出循環(huán)了。
c=--b;時,算式為c=c-b=1-2;經(jīng)過一次循環(huán)后就變成了c=0xff-2,經(jīng)過128次以后應(yīng)該也能跳出循環(huán)。
回復(fù)

使用道具 舉報

15#
ID:282046 發(fā)表于 2018-2-4 17:30 來自觸屏版 | 只看該作者
b=-b的話只循環(huán)兩次,b=b--的話就無限循環(huán)了
回復(fù)

使用道具 舉報

16#
ID:270522 發(fā)表于 2018-2-8 19:26 | 只看該作者
wulin 發(fā)表于 2018-1-31 21:19
你這樣理解是錯誤的。在這個程序中寫c=--b;或c=b--;只會影響while(c>0)花括號內(nèi)容循環(huán)2此或3次,與變量初 ...

好的謝謝
回復(fù)

使用道具 舉報

17#
ID:270522 發(fā)表于 2018-2-8 21:27 | 只看該作者
無線電菜蟲 發(fā)表于 2018-2-3 10:42
main函數(shù)結(jié)束后的執(zhí)行過程是未定義的

好的了解
回復(fù)

使用道具 舉報

18#
ID:283238 發(fā)表于 2018-2-9 08:35 | 只看該作者

根據(jù)第六行u8 b=2; b=b--,等效為b=2,
IEEE標(biāo)準(zhǔn)過程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

在非標(biāo)準(zhǔn)編譯器中可能有不能的行為。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表