久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2912|回復: 17
收起左側

關于C語言--b的問題

[復制鏈接]
ID:270522 發表于 2018-1-28 13:09 | 顯示全部樓層 |閱讀模式
#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,不是應該循環兩次嗎,為什么無限次循環
回復

使用道具 舉報

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也是無限循環啊
回復

使用道具 舉報

ID:270522 發表于 2018-1-28 15:51 | 顯示全部樓層
qq1105424012 發表于 2018-1-28 14:32
感覺B=B-- 也是一樣的效果啊

b=--b的話只循環兩次,b=b--的話就無限循環了
回復

使用道具 舉報

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);
                }
        }
}
回復

使用道具 舉報

ID:270522 發表于 2018-1-28 17:55 | 顯示全部樓層
wulin 發表于 2018-1-28 16:59
你理解是對的, while(c>0)花括號里內容只能循環兩次,程序結束,但可以再次進入main(), b、c都被初始化, ...

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

使用道具 舉報

ID:7485 發表于 2018-1-28 20:12 | 顯示全部樓層
一個是先減后賦值,一個是先賦值后減。
回復

使用道具 舉報

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次。 無標題.jpg

回復

使用道具 舉報

ID:270522 發表于 2018-1-31 16:38 | 顯示全部樓層
wulin 發表于 2018-1-28 20:59
--b;和b--;單獨使用沒有區別,如用于賦值或運算是不一樣的。
c=--b;為b先自減1后再賦值,此時c=1,b=1。 ...

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

使用道具 舉報

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編譯環境的調試狀態確認的,并不能代表其它編譯環境也得到這樣的結果。
回復

使用道具 舉報

ID:213173 發表于 2018-1-31 21:23 | 顯示全部樓層
zhuwushi 發表于 2018-1-31 16:38
是后賦值的會初始化,先賦值再自減的不會再初始化的意思嗎

你可以把這個程序在編譯器的調試狀態單步運行查看運行狀態。
回復

使用道具 舉報

ID:232585 發表于 2018-2-3 10:42 | 顯示全部樓層
main函數結束后的執行過程是未定義的
回復

使用道具 舉報

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次以后應該也能跳出循環。
回復

使用道具 舉報

ID:282046 發表于 2018-2-4 17:30 來自觸屏版 | 顯示全部樓層
b=-b的話只循環兩次,b=b--的話就無限循環了
回復

使用道具 舉報

ID:270522 發表于 2018-2-8 19:26 | 顯示全部樓層
wulin 發表于 2018-1-31 21:19
你這樣理解是錯誤的。在這個程序中寫c=--b;或c=b--;只會影響while(c>0)花括號內容循環2此或3次,與變量初 ...

好的謝謝
回復

使用道具 舉報

ID:270522 發表于 2018-2-8 21:27 | 顯示全部樓層
無線電菜蟲 發表于 2018-2-3 10:42
main函數結束后的執行過程是未定義的

好的了解
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区在线播放 | 日韩av在线中文字幕 | 精品国产成人 | 国产成人精品亚洲日本在线观看 | 久久精品av麻豆的观看方式 | 国产高潮好爽受不了了夜夜做 | 亚洲成人在线视频播放 | 天天干干 | 国产高清精品一区二区三区 | 国产综合精品一区二区三区 | 97伦理电影网 | 久久精品国产一区二区 | 97精品超碰一区二区三区 | 久久精品97| 成人在线观看网址 | 国产精品无 | 在线免费av观看 | 中文av在线播放 | 久久久久无码国产精品一区 | 欧美视频二区 | 午夜精品久久久久久久久久久久 | 日本 欧美 三级 高清 视频 | 99爱国产 | 91精品久久久久久久99 | 亚洲精品久久久久中文字幕二区 | 精品一区二区三 | 欧美区日韩区 | 美女视频一区 | 成人国产精品免费观看 | 日韩国产精品一区二区三区 | 欧美最猛性xxxxx亚洲精品 | 在线国产一区二区三区 | 91免费电影| 狠狠的干 | 人人九九精 | 亚洲精品久久久久avwww潮水 | 精品福利一区二区三区 | 欧美综合久久 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 最新中文字幕在线 | www.欧美视频 |