PTT推薦

[請益] 這是什麼語法 (for C)?

看板Soft_Job標題[請益] 這是什麼語法 (for C)?作者
wsad50232
(GGYY)
時間推噓51 推:52 噓:1 →:83

*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 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.25.207 (臺灣)
PTT 網址

NDark05/14 13:58應該是指定某一已知記憶體的數值

NDark05/14 13:58具體來說要看那塊記憶體有什麼特殊

DarkIllusion05/14 14:00抱歉 我不太懂你對哪個部分不懂?

OyodoKai05/14 14:00哪裡看不懂?

ccpz05/14 14:02=右邊的部分,是把字串當陣列,去抓出某個 char 而已

TheOneisNEO05/14 14:16就排排站然後取index吧 你把那一長串字串先assign給

TheOneisNEO05/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

NDark05/14 16:53基本上賣弄技巧的程式碼都是軟體工程的大敵

NDark05/14 16:54在我手下 有人敢這樣寫 我一定背後記住

TwitchGod05/14 17:02看不懂這該回去重修大一程設吧

Belieeve05/14 17:23看來是道行高深的忍者呢

wulouise05/14 17:24不會看不懂 可是code review不被電很奇怪

steve101205/14 17:43這根本過不了code review

calqlus05/14 17:44阿就atoi的封裝寫法

calqlus05/14 17:47平常會用查內建函式就很不錯了

ManOfSteel05/14 18:54不會看不懂,但是看這個心情會很差...

ssccg05/14 19:05轉換用先建好的表 + 算index查表算是很平常的做法吧?

ssccg05/14 19:06單純抓這一行來看才會一時看不懂,原本的函式很好懂啊

ssccg05/14 19:09覺得這篇的問法有點斷章取義

Gaogaigar05/14 20:36前面註解寫個LUT 我review 會給過

jayd05/14 20:54這種寫法code review絕對被靠北

shadow032605/14 22:50這不是賣弄,而是偷懶吧

shownlin05/15 01:38這個用法覺得還算正常...最近在碰device tree compiler

shownlin05/15 01:38裡面的checker也是這樣建表的

shownlin05/15 01:39大家review的規則比大神還嚴欸0.0

CoNsTaR05/15 02:52很多人對爛 code 的定義就是只要我看不懂就是爛 code

CoNsTaR05/15 02:52code smell 的定義就是只要不合我的意就是 code smell

CoNsTaR05/15 02:52結果自己寫出來的反而笑死人

wei11505/15 02:56還好吧 就把字串當陣列用阿 其實我覺得*ptr++還要想一下(x

netburst05/15 03:31

sunsamy05/15 04:01也許人家是刷題仔,刷題很多這種賣弄技巧的寫法,解法

OnlyRD05/15 09:11c型別系統和指針不熟才會看不懂吧?另外說review不

OnlyRD05/15 09:11會過,大部分

OnlyRD05/15 09:11應該都是在做上層應用的人,原程式是為了解決itoa

OnlyRD05/15 09:11並不在c標準的

OnlyRD05/15 09:11問題,因此才產生這份code,當然對於效能和記憶體

OnlyRD05/15 09:11的要求就遠高於

OnlyRD05/15 09:11易讀,畢竟各位上層高手幾個人會去看c標準庫的實作

OnlyRD05/15 09:11?toolchain自

OnlyRD05/15 09:11帶標準庫通常也都只有程式庫和標頭檔而已。但這類

OnlyRD05/15 09:11缺乏易讀性很像

OnlyRD05/15 09:11在玩技巧的實作方法,越底層的庫越多,都是有它的

OnlyRD05/15 09:11理由的,又不是

OnlyRD05/15 09:11吃飽閒著。而且這段code對寫c的人很基本吧?看不懂

OnlyRD05/15 09:11的人你才要擔

OnlyRD05/15 09:11心他會不會製造許多型別轉換和指標操作的詭異bug。

shooter55505/15 09:16很少看到不先把常數字串先定義好再用的寫法

shooter55505/15 09:17給個變數名 後人還能知道這串是什麼碗糕

sanctitysky05/15 09:18對c來說 很清楚常見

yupog200305/15 09:34推OnlyRD,易讀性和效能有時候沒辦法兼顧,看需求而已

sazabijiang05/15 11:45這就是為什麼會有Java的誕生

Bencrie05/15 12:34有標準的 snprintf 要這個幹嘛?

wulouise05/15 14:12底層library跟上層應用的review標準不同,我是以上層看

labbat05/15 14:15去跟主管講唄,說服網友幹嘛

wulouise05/15 14:19@Bencrie 見https://bit.ly/3LdC6LV 它比snprintf快

sazabijiang05/15 14:22一個後人無法容易維護的程式碼,就是爛的程式碼

bnd032705/15 16:21這行就是沒有要讓人維護的,這是基礎函式,不是商業邏輯

sazabijiang05/15 16:32然後會出錯的地方,就是這種沒打算讓人維護的地方

brucetu05/15 17:57寫底層的跟寫商業邏輯的在討論可讀性

brucetu05/15 17:58目的就不同 作法當然不同

brucetu05/15 18:00code review看到這段code出現在itoa的實作裡面

brucetu05/15 18:00還感覺不出是在做什麼操作的 是review的人有問題吧?

brucetu05/15 18:00review本來就要看整個context啊

Bencrie05/15 18:50不要可讀那不考慮直上 asm 嗎?

Firstshadow05/15 19:16這個很好讀吧 哪裡不好讀==

shownlin05/15 19:47kernel裡面不就一堆.s

shownlin05/15 19:50話說這一段code明明就很直白

shownlin05/15 19:50硬要扯說看不懂也太扯

acgotaku05/15 20:27大家這麼兇 以後誰敢問問題

acgotaku05/15 20:30但會這樣寫的,有點像是程式新手

knme05/15 20:32code review看到這個,會希望前面多個註解

shownlin05/15 20:52原來GCC底層是一群新手寫的嗎……

wulouise05/15 21:08本來code review就是根據維護人的能力來評估的

wulouise05/15 21:09實際上不會有這麼多人都有維護gcc底層的能力

sarafciel05/15 22:37新手才不敢這樣寫啦 要看懂這段code會吃對指標的理解

manmay05/16 00:44常數字串查表比額外宣告一個區域變數快很多吧

hengsao05/16 04:57一群能力不到的人對自己能力不到的程式庫該怎麼實作很有

hengsao05/16 04:57意見==

shooter55505/16 09:34不提前宣告這串char 而丟在loop裡面 不知道是什麼操作

shooter55505/16 09:35是我是不會這樣寫

shooter55505/16 09:37前面推文有提到理由 那這邊的理由不知道是什麼 有高手

shooter55505/16 09:37知道的嗎

xxtuoo05/16 09:43這幾行看不懂的 才該被注意Zzz

ssccg05/16 11:38常數丟在loop裡還是常數,就只用在這為什麼要另外生個變數?

freef1y305/16 11:45compiler沒這麼笨 你就算先生個變數存也不會比較慢啦..

aasssdddd05/16 12:38第一次看到 長姿勢了 不管寫法一定有地方特別存那字串

ssccg05/16 12:46不是說快慢有差,是在回兩樓前的,為什麼要提前宣告?

labbat05/16 13:30一大串人類看不懂啊,宣告就是逐步做一大串做的事情

sarafciel05/16 14:01不會比較慢其實不好說XD 要看你變數型態怎麼給

sarafciel05/16 14:02compiler不笨沒錯 但compiler會為了programmer變笨

sarafciel05/16 14:06然後你知道函式是itoa的話,要理解那個字串的意圖不難

sarafciel05/16 14:06在這個前提下,他這樣寫的用意我猜是scope

sarafciel05/16 14:07就跟anonymous function的目的一樣,只在某處只用一次

sarafciel05/16 14:08如果你把這個表拉出去迴圈外,作為reviewer

sarafciel05/16 14:08第一時間看會假定這個字串在函式內有好幾個地方用到

sarafciel05/16 14:09而他這樣寫相當於告訴你scope鎖死在這一行

brucetu05/16 21:09到底是*ptr++=真的沒那麼難懂

brucetu05/16 21:10字串查表也很常見

brucetu05/16 21:14很多爛程式可讀性差是因為物件之間的關係混亂 職權不清。

brucetu05/16 21:14看不懂這行的叫做語法不熟 不是他寫成一行可讀性差

manmay05/17 00:51c語言標準有定義 常數字串的storage duration

manmay05/17 00:51C99 $6.7.8 Initialization

descent05/17 17:58c 博大精深, 真的有很多沒看過的用法。

descent05/17 18:01另外char no_name[72]="z.." 可能應該要改

descent05/17 18:01const char *no_name = "z..." 比較恰當

oToToT05/17 18:16上面那樣改的話no_name還是會被指去不同地方,可能還是不

oToToT05/17 18:16太好?

descent05/17 20:26這問題也可以 po 到 c_cpp 版

newking76105/18 08:34如果我是你老闆,你大概離職了

wsad5023205/18 11:34樓上可能不適合當老闆

Isaea05/18 12:37c最多這種把好幾行濃縮在一行的寫法,老實的拆開不好嗎

sazabijiang05/18 17:34炫技

eva1945200205/20 17:59寫個可讀性高的程式碼會犧牲很多效能嗎?

OnlyRD05/21 15:49compiler會把c string放到字串section,程式啟動後

OnlyRD05/21 15:49初始化,整段

OnlyRD05/21 15:49操作只是計算記憶體中的偏移量再去計算而已。以為c

OnlyRD05/21 15:49碼農應該都對c

OnlyRD05/21 15:49ompiler不陌生才對,因為c就是貼近底層的語言。整

OnlyRD05/21 15:49串看下來,好像

OnlyRD05/21 15:49不少人對語言標準、編譯器都沒啥掌握,避開底層工

OnlyRD05/21 15:49作吧。

cia109905/21 20:32不會到看不懂,只是要回想思考一下,這就會讓人憤怒

wulouise05/21 20:51歷史因素 就像++i i++現在幾乎沒差除非compiler很爛

wulouise05/21 21:23有些時候當時那樣寫效率最高 但是現在不這樣寫不一定差

OnlyRD05/22 03:48樓上,要看你的i是什麼type,c++會更複雜一點,而

OnlyRD05/22 03:48且在某些支援特

OnlyRD05/22 03:48殊指令的cpu上有差別。另外++i和i++的語意不同,怎

OnlyRD05/22 03:48麼會沒差?如

OnlyRD05/22 03:48果是c++,換成class和template再試試看就知道了。

wulouise05/22 14:26可能我省略太多,是單行的i++;跟++i;不是所有情況

DoubleFree05/24 10:30看不懂就是爛code 我還滿同意的

DoubleFree05/24 10:30明明有更清楚的寫法幹嘛弄成跟大便一樣

ohohohya06/04 05:59基本上你待在公司就寫符合公司coding style的code就好

ohohohya06/04 05:59了 這段老實講沒到會被reviewer打槍的程度 大意也只是

ohohohya06/04 05:59從字串中間開始計算要拿哪個index字元的ascii加回*ptr

ohohohya06/04 05:59的內容而已