Re: [問題] ++ & * 之優先順序
※ 引述《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
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
11/10 22:04, 11F
→
11/10 22:14, , 12F
11/10 22:14, 12F
→
11/10 22:14, , 13F
11/10 22:14, 13F
推
11/10 22:22, , 14F
11/10 22:22, 14F
→
11/10 22:23, , 15F
11/10 22:23, 15F
推
11/10 23:40, , 16F
11/10 23:40, 16F
→
11/12 12:25, , 17F
11/12 12:25, 17F
→
11/12 12:26, , 18F
11/12 12:26, 18F
→
11/12 12:27, , 19F
11/12 12:27, 19F
→
11/12 12:28, , 20F
11/12 12:28, 20F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):