作者poyenc (高髮箍)
看板C_and_CPP
標題Re: [問題] ++ & * 之優先順序
時間Thu Nov 10 04:21:59 2011
※ 引述《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
推 james732:我現在才發現這個帳號是版主... 11/10 05:05
推 tropical72:推 :) ( 我都不敢擢破這件事,最後還是被擢破了 ) 11/10 05:31
→ james732:啊,不該說的嗎? 11/10 07:07
推 purpose:暱稱都一樣呀 11/10 07:08
推 monkey12:感謝您詳細的介紹 十分感謝!!! 11/10 11:07
推 diabloevagto:我都沒發現說(筆記) 話說用dbg的工具也滿好用的 11/10 11:21
→ x000032001:文章中看到很多顏色就大概可以猜出來是... 11/10 12:18
推 jason12308:最後一段話是何意? 11/10 21:34
→ x000032001:就是簡化到有點病態啦 11/10 21:34
→ angleevil:難怪最近覺得版主消失了 11/10 21:36
→ xatier:之前看到暱稱和 ip 就想說... 11/10 22:04
→ tomnelson:嗯,很棒!可我還是還寫那"while(*d++=*s++);"東西出來,因 11/10 22:14
→ tomnelson:為我知道compiler看得懂... Orz 11/10 22:14
推 xatier:while (*d++=*s++); 不是 K&R 裡最經典的範例嗎XD 11/10 22:22
→ xatier:不過真的不建議寫就是了...萬一有人把 = 改成 == 就噴了 11/10 22:23
推 VictorTom:小弟我還沒發現這是板主....XD 11/10 23:40
→ tomnelson:我還沒拜讀該本經典,只是原po中變數命名太長,所以就變成 11/12 12:25
→ tomnelson:d和s了! 真的在程式中,用原po的dest與src命名是比較被建 11/12 12:26
→ tomnelson:議的,因為這樣人家比較能夠快速看出這簡短的程式在幹啥. 11/12 12:27
→ tomnelson:(畢竟編出來的machine不會因為命名不同而不同!) 11/12 12:28