標(biāo)題: 關(guān)于C語(yǔ)言--b的問(wèn)題 [打印本頁(yè)]

作者: zhuwushi    時(shí)間: 2018-1-28 13:09
標(biāo)題: 關(guān)于C語(yǔ)言--b的問(wè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)兩次嗎,為什么無(wú)限次循環(huán)
作者: qq1105424012    時(shí)間: 2018-1-28 14:32
感覺B=B-- 也是一樣的效果啊
作者: cccc888    時(shí)間: 2018-1-28 14:36
根據(jù)第六行u8 b=2; b=b--,等效為b=2,
IEEE標(biāo)準(zhǔn)過(guò)程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

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

作者: zhuwushi    時(shí)間: 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)過(guò)程如下,副本作用
TEMPb=b;b=b-1;b=TEMPb;

就是說(shuō)b一直都為原來(lái)的值,謝謝,那為什么c=--b也是無(wú)限循環(huán)啊
作者: zhuwushi    時(shí)間: 2018-1-28 15:51
qq1105424012 發(fā)表于 2018-1-28 14:32
感覺B=B-- 也是一樣的效果啊

b=--b的話只循環(huán)兩次,b=b--的話就無(wú)限循環(huán)了
作者: wulin    時(shí)間: 2018-1-28 16:59
你理解是對(duì)的, while(c>0)花括號(hào)里內(nèi)容只能循環(huán)兩次,程序結(jié)束,但可以再次進(jìn)入main(), b、c都被初始化,所以目測(cè)感覺在無(wú)限循環(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;        //加一條全亮語(yǔ)句,可以看到反復(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);
                }
        }
}

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

謝謝大神,但是為什么我把c=--b改成c=b--就執(zhí)行三次就結(jié)束了,不會(huì)被初始化呢
作者: ahshmj    時(shí)間: 2018-1-28 20:12
一個(gè)是先減后賦值,一個(gè)是先賦值后減。
作者: wulin    時(shí)間: 2018-1-28 20:59
zhuwushi 發(fā)表于 2018-1-28 17:55
謝謝大神,但是為什么我把c=--b改成c=b--就執(zhí)行三次就結(jié)束了,不會(huì)被初始化呢

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


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

是后賦值的會(huì)初始化,先賦值再自減的不會(huì)再初始化的意思嗎
作者: wulin    時(shí)間: 2018-1-31 21:19
zhuwushi 發(fā)表于 2018-1-31 16:38
是后賦值的會(huì)初始化,先賦值再自減的不會(huì)再初始化的意思嗎

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

你可以把這個(gè)程序在編譯器的調(diào)試狀態(tài)單步運(yùn)行查看運(yùn)行狀態(tài)。
作者: 無(wú)線電菜蟲    時(shí)間: 2018-2-3 10:42
main函數(shù)結(jié)束后的執(zhí)行過(guò)程是未定義的
作者: wannenggong    時(shí)間: 2018-2-3 14:36
理論計(jì)算與分步調(diào)試都可以看到結(jié)果如下:
c=b--;時(shí)算式為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;時(shí),算式為c=c-b=1-2;經(jīng)過(guò)一次循環(huán)后就變成了c=0xff-2,經(jīng)過(guò)128次以后應(yīng)該也能跳出循環(huán)。
作者: 17089306679    時(shí)間: 2018-2-4 17:30
b=-b的話只循環(huán)兩次,b=b--的話就無(wú)限循環(huán)了
作者: zhuwushi    時(shí)間: 2018-2-8 19:26
wulin 發(fā)表于 2018-1-31 21:19
你這樣理解是錯(cuò)誤的。在這個(gè)程序中寫c=--b;或c=b--;只會(huì)影響while(c>0)花括號(hào)內(nèi)容循環(huán)2此或3次,與變量初 ...

好的謝謝
作者: zhuwushi    時(shí)間: 2018-2-8 21:27
無(wú)線電菜蟲 發(fā)表于 2018-2-3 10:42
main函數(shù)結(jié)束后的執(zhí)行過(guò)程是未定義的

好的了解
作者: ming7511199    時(shí)間: 2018-2-9 08:35

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

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1