全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1523
推到 Plurk!
推到 Facebook!

請問while(*++p1)是怎麼運算的呢?

答題得分者是:RaynorPao
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-02 12:51:17 IP:59.125.xxx.xxx 未訂閱
請問各位大大下面程式碼的while(*p1 =*p2 );
是如何運算的,能否請大大詳細解釋一下,
因為這是我第一次看過這種寫法,看不太懂。
-謝謝!謝謝!

[code cpp]
int main(){
char str1[41]="666666";
char str2[21]="333";
char *p1,*p2;
p1=str1-1;
while(* p1); //p1指向str1尾部的0
p2=str2;
while(*p1 =*p2 ); //str2複製至str1後面
*p1=0; //串接後字串的尾部0

[/code]
------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2008-09-02 12:51:58, 註解 無‧
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-02 16:24:55 IP:210.208.xxx.xxx 訂閱
[code cpp]
p1=str1-1;
[/code]

(1)以上這一行程式碼,先把 p1 指標,指向 str1 字串位址的前一個位址

[code cpp]
while(* p1);
[/code]

(2)以上這一行程式碼,先做 p1=p1 1 的動作,代表 p1 指向 str1 字串的第一個 byte 的位址
(3)前面加星號代表取出這個位址的值,其值是「6」,ASC 值是 0x36,不為 0,因此為 true,所以此 while 迴圈會繼續執行(在 C 語言中,0 值視為 false,非 0 值視為 true)
(4)依此類推,直到 p1 指向 str1 字串的結尾 0x00,因此為 false,所以會跳出 while 迴圈

[code cpp]
p2=str2;
[/code]

(5)以上這一行程式碼,先把 p2 指標,指向 str2 字串的第一個 byte 的位址

[code cpp]
while(*p1 =*p2 );
[/code]

(6)以上這一行程式碼,先把 p2 位址的值 assign 給 p1 位址儲存,而 p1 位址的值是「3」,ASC 值是 0x33,不為 0,因此為 true,所以此 while 迴圈會繼續執行(在 C 語言中,你如果把一個非 0 的值 assign 給一個變數,視為 true;如果把一個 0 的值 assign 給一個變數,視為 false)
(7)接著分別把 p1 指向的位址加 1,以及 p2 指向的位址加 1
(8)依此類推,直到 p2 指向 str2 字串的結尾 0x00,因此為 false,所以會跳出 while 迴圈

[code cpp]
*p1=0;
[/code]

(9)以上這一行程式碼,把 p1 垃址的值 assign 為 0x00

(10)其實以上這幾行程式碼,用以下這一行程式碼就可以達到目的,我想可能是有什麼特殊的原因,才會這樣寫的吧?

[code cpp]
strcat(str1, str2);
[/code]
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-02 21:35:16 IP:59.125.xxx.xxx 未訂閱
嗯嗯!我懂了,謝謝RaynorPao版主大大用心的解釋。
實在太感謝了!謝謝!
------
-謝謝大大熱心的回覆!謝謝!
系統時間:2024-04-19 16:49:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!