看板 Soft_Job 關於我們 聯絡資訊
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; 在這邊看到的 https://stackoverflow.com/questions/8257714/how-to-convert-an-int-to-string-in-c 不怕各位笑,小弟摸C語言這麼久,今天第一次看到這種寫法 看了半天,實在是不知道是什麼意思 程式碼我Compile過,確定是可以編譯可以Run的 有高手能給個解答嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.25.207 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1652507531.A.5E9.html
NDark: 應該是指定某一已知記憶體的數值 05/14 13:58
NDark: 具體來說要看那塊記憶體有什麼特殊 05/14 13:58
DarkIllusion: 抱歉 我不太懂你對哪個部分不懂? 05/14 14:00
OyodoKai: 哪裡看不懂? 05/14 14:00
ccpz: =右邊的部分,是把字串當陣列,去抓出某個 char 而已 05/14 14:02
TheOneisNEO: 就排排站然後取index吧 你把那一長串字串先assign給 05/14 14:16
TheOneisNEO: 另外一個變數也可以 05/14 14:16
有人將它帶換成這兩行,然後我就看懂了 char no_name[72]="zyxwvutsrqponmlkjihgfedcba9876543210~ vwxyz"; *ptr++ = no_name[35 + (tmp_value - value * base)]; 感謝csfgsj的私下解答 ※ 編輯: wsad50232 (36.229.25.207 臺灣), 05/14/2022 14:23:35
NDark: 基本上賣弄技巧的程式碼都是軟體工程的大敵 05/14 16:53
NDark: 在我手下 有人敢這樣寫 我一定背後記住 05/14 16:54
TwitchGod: 看不懂這該回去重修大一程設吧 05/14 17:02
Belieeve: 看來是道行高深的忍者呢 05/14 17:23
wulouise: 不會看不懂 可是code review不被電很奇怪 05/14 17:24
steve1012: 這根本過不了code review 05/14 17:43
calqlus: 阿就atoi的封裝寫法 05/14 17:44
calqlus: 平常會用查內建函式就很不錯了 05/14 17:47
ManOfSteel: 不會看不懂,但是看這個心情會很差... 05/14 18:54
ssccg: 轉換用先建好的表 + 算index查表算是很平常的做法吧? 05/14 19:05
ssccg: 單純抓這一行來看才會一時看不懂,原本的函式很好懂啊 05/14 19:06
ssccg: 覺得這篇的問法有點斷章取義 05/14 19:09
Gaogaigar: 前面註解寫個LUT 我review 會給過 05/14 20:36
jayd: 這種寫法code review絕對被靠北 05/14 20:54
shadow0326: 這不是賣弄,而是偷懶吧 05/14 22:50
shownlin: 這個用法覺得還算正常...最近在碰device tree compiler 05/15 01:38
shownlin: 裡面的checker也是這樣建表的 05/15 01:38
shownlin: 大家review的規則比大神還嚴欸0.0 05/15 01:39
CoNsTaR: 很多人對爛 code 的定義就是只要我看不懂就是爛 code 05/15 02:52
CoNsTaR: code smell 的定義就是只要不合我的意就是 code smell 05/15 02:52
CoNsTaR: 結果自己寫出來的反而笑死人 05/15 02:52
wei115: 還好吧 就把字串當陣列用阿 其實我覺得*ptr++還要想一下(x 05/15 02:56
netburst: 真 05/15 03:31
sunsamy: 也許人家是刷題仔,刷題很多這種賣弄技巧的寫法,解法 05/15 04:01
OnlyRD: c型別系統和指針不熟才會看不懂吧?另外說review不 05/15 09:11
OnlyRD: 會過,大部分 05/15 09:11
OnlyRD: 應該都是在做上層應用的人,原程式是為了解決itoa 05/15 09:11
OnlyRD: 並不在c標準的 05/15 09:11
OnlyRD: 問題,因此才產生這份code,當然對於效能和記憶體 05/15 09:11
OnlyRD: 的要求就遠高於 05/15 09:11
OnlyRD: 易讀,畢竟各位上層高手幾個人會去看c標準庫的實作 05/15 09:11
OnlyRD: ?toolchain自 05/15 09:11
OnlyRD: 帶標準庫通常也都只有程式庫和標頭檔而已。但這類 05/15 09:11
OnlyRD: 缺乏易讀性很像 05/15 09:11
OnlyRD: 在玩技巧的實作方法,越底層的庫越多,都是有它的 05/15 09:11
OnlyRD: 理由的,又不是 05/15 09:11
OnlyRD: 吃飽閒著。而且這段code對寫c的人很基本吧?看不懂 05/15 09:11
OnlyRD: 的人你才要擔 05/15 09:11
OnlyRD: 心他會不會製造許多型別轉換和指標操作的詭異bug。 05/15 09:11
shooter555: 很少看到不先把常數字串先定義好再用的寫法 05/15 09:16
shooter555: 給個變數名 後人還能知道這串是什麼碗糕 05/15 09:17
sanctitysky: 對c來說 很清楚常見 05/15 09:18
yupog2003: 推OnlyRD,易讀性和效能有時候沒辦法兼顧,看需求而已 05/15 09:34
sazabijiang: 這就是為什麼會有Java的誕生 05/15 11:45
Bencrie: 有標準的 snprintf 要這個幹嘛? 05/15 12:34
wulouise: 底層library跟上層應用的review標準不同,我是以上層看 05/15 14:12
labbat: 去跟主管講唄,說服網友幹嘛 05/15 14:15
wulouise: @Bencrie 見https://bit.ly/3LdC6LV 它比snprintf快 05/15 14:19
sazabijiang: 一個後人無法容易維護的程式碼,就是爛的程式碼 05/15 14:22
bnd0327: 這行就是沒有要讓人維護的,這是基礎函式,不是商業邏輯 05/15 16:21
sazabijiang: 然後會出錯的地方,就是這種沒打算讓人維護的地方 05/15 16:32
brucetu: 寫底層的跟寫商業邏輯的在討論可讀性 05/15 17:57
brucetu: 目的就不同 作法當然不同 05/15 17:58
brucetu: code review看到這段code出現在itoa的實作裡面 05/15 18:00
brucetu: 還感覺不出是在做什麼操作的 是review的人有問題吧? 05/15 18:00
brucetu: review本來就要看整個context啊 05/15 18:00
Bencrie: 不要可讀那不考慮直上 asm 嗎? 05/15 18:50
Firstshadow: 這個很好讀吧 哪裡不好讀== 05/15 19:16
shownlin: kernel裡面不就一堆.s 05/15 19:47
shownlin: 話說這一段code明明就很直白 05/15 19:50
shownlin: 硬要扯說看不懂也太扯 05/15 19:50
acgotaku: 大家這麼兇 以後誰敢問問題 05/15 20:27
acgotaku: 但會這樣寫的,有點像是程式新手 05/15 20:30
knme: code review看到這個,會希望前面多個註解 05/15 20:32
shownlin: 原來GCC底層是一群新手寫的嗎…… 05/15 20:52
wulouise: 本來code review就是根據維護人的能力來評估的 05/15 21:08
wulouise: 實際上不會有這麼多人都有維護gcc底層的能力 05/15 21:09
sarafciel: 新手才不敢這樣寫啦 要看懂這段code會吃對指標的理解 05/15 22:37
manmay: 常數字串查表比額外宣告一個區域變數快很多吧 05/16 00:44
hengsao: 一群能力不到的人對自己能力不到的程式庫該怎麼實作很有 05/16 04:57
hengsao: 意見== 05/16 04:57
shooter555: 不提前宣告這串char 而丟在loop裡面 不知道是什麼操作 05/16 09:34
shooter555: 是我是不會這樣寫 05/16 09:35
shooter555: 前面推文有提到理由 那這邊的理由不知道是什麼 有高手 05/16 09:37
shooter555: 知道的嗎 05/16 09:37
xxtuoo: 這幾行看不懂的 才該被注意Zzz 05/16 09:43
ssccg: 常數丟在loop裡還是常數,就只用在這為什麼要另外生個變數? 05/16 11:38
freef1y3: compiler沒這麼笨 你就算先生個變數存也不會比較慢啦.. 05/16 11:45
aasssdddd: 第一次看到 長姿勢了 不管寫法一定有地方特別存那字串 05/16 12:38
ssccg: 不是說快慢有差,是在回兩樓前的,為什麼要提前宣告? 05/16 12:46
labbat: 一大串人類看不懂啊,宣告就是逐步做一大串做的事情 05/16 13:30
sarafciel: 不會比較慢其實不好說XD 要看你變數型態怎麼給 05/16 14:01
sarafciel: compiler不笨沒錯 但compiler會為了programmer變笨 05/16 14:02
sarafciel: 然後你知道函式是itoa的話,要理解那個字串的意圖不難 05/16 14:06
sarafciel: 在這個前提下,他這樣寫的用意我猜是scope 05/16 14:06
sarafciel: 就跟anonymous function的目的一樣,只在某處只用一次 05/16 14:07
sarafciel: 如果你把這個表拉出去迴圈外,作為reviewer 05/16 14:08
sarafciel: 第一時間看會假定這個字串在函式內有好幾個地方用到 05/16 14:08
sarafciel: 而他這樣寫相當於告訴你scope鎖死在這一行 05/16 14:09
brucetu: 到底是*ptr++=真的沒那麼難懂 05/16 21:09
brucetu: 字串查表也很常見 05/16 21:10
brucetu: 很多爛程式可讀性差是因為物件之間的關係混亂 職權不清。 05/16 21:14
brucetu: 看不懂這行的叫做語法不熟 不是他寫成一行可讀性差 05/16 21:14
manmay: c語言標準有定義 常數字串的storage duration 05/17 00:51
manmay: C99 $6.7.8 Initialization 05/17 00:51
descent: c 博大精深, 真的有很多沒看過的用法。 05/17 17:58
descent: 另外char no_name[72]="z.." 可能應該要改 05/17 18:01
descent: const char *no_name = "z..." 比較恰當 05/17 18:01
oToToT: 上面那樣改的話no_name還是會被指去不同地方,可能還是不 05/17 18:16
oToToT: 太好? 05/17 18:16
descent: 這問題也可以 po 到 c_cpp 版 05/17 20:26
newking761: 如果我是你老闆,你大概離職了 05/18 08:34
wsad50232: 樓上可能不適合當老闆 05/18 11:34
Isaea: c最多這種把好幾行濃縮在一行的寫法,老實的拆開不好嗎 05/18 12:37
sazabijiang: 炫技 05/18 17:34
eva19452002: 寫個可讀性高的程式碼會犧牲很多效能嗎? 05/20 17:59
OnlyRD: compiler會把c string放到字串section,程式啟動後 05/21 15:49
OnlyRD: 初始化,整段 05/21 15:49
OnlyRD: 操作只是計算記憶體中的偏移量再去計算而已。以為c 05/21 15:49
OnlyRD: 碼農應該都對c 05/21 15:49
OnlyRD: ompiler不陌生才對,因為c就是貼近底層的語言。整 05/21 15:49
OnlyRD: 串看下來,好像 05/21 15:49
OnlyRD: 不少人對語言標準、編譯器都沒啥掌握,避開底層工 05/21 15:49
OnlyRD: 作吧。 05/21 15:49
cia1099: 不會到看不懂,只是要回想思考一下,這就會讓人憤怒 05/21 20:32
wulouise: 歷史因素 就像++i i++現在幾乎沒差除非compiler很爛 05/21 20:51
wulouise: 有些時候當時那樣寫效率最高 但是現在不這樣寫不一定差 05/21 21:23
OnlyRD: 樓上,要看你的i是什麼type,c++會更複雜一點,而 05/22 03:48
OnlyRD: 且在某些支援特 05/22 03:48
OnlyRD: 殊指令的cpu上有差別。另外++i和i++的語意不同,怎 05/22 03:48
OnlyRD: 麼會沒差?如 05/22 03:48
OnlyRD: 果是c++,換成class和template再試試看就知道了。 05/22 03:48
wulouise: 可能我省略太多,是單行的i++;跟++i;不是所有情況 05/22 14:26
DoubleFree: 看不懂就是爛code 我還滿同意的 05/24 10:30
DoubleFree: 明明有更清楚的寫法幹嘛弄成跟大便一樣 05/24 10:30
ohohohya: 基本上你待在公司就寫符合公司coding style的code就好 06/04 05:59
ohohohya: 了 這段老實講沒到會被reviewer打槍的程度 大意也只是 06/04 05:59
ohohohya: 從字串中間開始計算要拿哪個index字元的ascii加回*ptr 06/04 05:59
ohohohya: 的內容而已 06/04 05:59