Re: [問題] ++ & * 之優先順序

看板C_and_CPP作者 (高髮箍)時間14年前 (2011/11/10 04:22), 編輯推噓8(8012)
留言20則, 11人參與, 最新討論串2/2 (看更多)
※ 引述《monkey12 (猴仔)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++ : 問題(Question): : char str[] = "Love"; : char* p = str; : printf("%c", *p++); : 我查了一下++高於*(dereference) : 那這樣 結果不是應該是o嗎? : 先指標往前移一個位置 : 然後在指向資料內容?? : 但實際執行結果是L?? : 感謝大家 以下內容僅供參考, 畢竟我跟你一樣都只是 baby programmer 記住以下兩個原則: (1) 有問題時, printf() 永遠是你的好朋友 (2) 想到什麼寫什麼, 有必要再化簡 你原本的問題是: a. 先讓指標往前移一個位置 b. 再印出指標指向的資料內容 中文明明是兩句, 你為什麼要把它寫成一行程式碼呢? p = p + 1; // a. printf( "%c", *p ); // b. 不明白原理時, 要想到原則(1), 每行都印出你有改到值的變數, 為了對照, 改前改後都印: printf( "%p", (void*)p ); // 印出加之前的指標值 p = p + 1; printf( "%p", (void*)p ); // 印出加之後的指標值 printf( "%c", *p ); // 因為沒改到值就不用印 在我電腦上的執行結果如下: 0022ff47 0022ff48 o 最後真的印出字元'o'! 所以回去把紫色底的程式碼刪除, 這段程 式基本上就完成了. 你如果覺得 p = p + 1 太長想改寫也是可以, 不過先確定有達成 一樣的效果: printf( "%p", (void*)p ); // 印出加之前的指標值 p++; printf( "%p", (void*)p ); // 印出加之後的指標值 printf( "%c", *p ); 這段執行結果是: 0022ff47 0022ff48 o ok這次改寫沒問題, 當你又想把黃底的部份用 p++ 替換掉, 一樣 先確定值是你想要的: printf( "%p", (void*)p ); // 印出加之前的指標值 char *q = p++; printf( "%p", (void*)p ); // 印出加之後的指標值 printf( "%p", (void*)q ); // 這邊加印指標q的值 printf( "%c", *q ); 執行結果: 0022ff47 0022ff48 0022ff47 o 很明顯在印字元之前 q 的數值已經跟前幾次數值不一樣, 結果有 落差是理所當然的. p++; printf( "%c", *p ); 這樣已經是最好的寫法, 符合你的敘述又不需考慮優先權, 我覺得 與其背那些還不如留點腦容量去想怎麼賺更多錢! 至於: while(*dest++ = *src++); 這樣字串複製的程式碼我一直看不懂也不想看懂, 因為那只有卓越 的 programmer 才會用的術語. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

11/10 05:05, , 1F
我現在才發現這個帳號是版主...
11/10 05:05, 1F

11/10 05:31, , 2F
推 :) ( 我都不敢擢破這件事,最後還是被擢破了 )
11/10 05:31, 2F

11/10 07:07, , 3F
啊,不該說的嗎?
11/10 07:07, 3F

11/10 07:08, , 4F
暱稱都一樣呀
11/10 07:08, 4F

11/10 11:07, , 5F
感謝您詳細的介紹 十分感謝!!!
11/10 11:07, 5F

11/10 11:21, , 6F
我都沒發現說(筆記) 話說用dbg的工具也滿好用的
11/10 11:21, 6F

11/10 12:18, , 7F
文章中看到很多顏色就大概可以猜出來是...
11/10 12:18, 7F

11/10 21:34, , 8F
最後一段話是何意?
11/10 21:34, 8F

11/10 21:34, , 9F
就是簡化到有點病態啦
11/10 21:34, 9F

11/10 21:36, , 10F
難怪最近覺得版主消失了
11/10 21:36, 10F

11/10 22:04, , 11F
之前看到暱稱和 ip 就想說...
11/10 22:04, 11F

11/10 22:14, , 12F
嗯,很棒!可我還是還寫那"while(*d++=*s++);"東西出來,因
11/10 22:14, 12F

11/10 22:14, , 13F
為我知道compiler看得懂... Orz
11/10 22:14, 13F

11/10 22:22, , 14F
while (*d++=*s++); 不是 K&R 裡最經典的範例嗎XD
11/10 22:22, 14F

11/10 22:23, , 15F
不過真的不建議寫就是了...萬一有人把 = 改成 == 就噴了
11/10 22:23, 15F

11/10 23:40, , 16F
小弟我還沒發現這是板主....XD
11/10 23:40, 16F

11/12 12:25, , 17F
我還沒拜讀該本經典,只是原po中變數命名太長,所以就變成
11/12 12:25, 17F

11/12 12:26, , 18F
d和s了! 真的在程式中,用原po的dest與src命名是比較被建
11/12 12:26, 18F

11/12 12:27, , 19F
議的,因為這樣人家比較能夠快速看出這簡短的程式在幹啥.
11/12 12:27, 19F

11/12 12:28, , 20F
(畢竟編出來的machine不會因為命名不同而不同!)
11/12 12:28, 20F
文章代碼(AID): #1Ekk3geg (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Ekk3geg (C_and_CPP)