欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于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.raoushi.com/bbs/) Powered by Discuz! X3.1