看板 Soft_Job 關於我們 聯絡資訊
你說的沒錯, 程式語言就是工具而已, 但是很多人連工具都用不好. 我的觀念是工欲善其事, 必先利其器, 基本的程式語言技巧是第一 個要掌握的, 其次, 要熟悉所你使用的編程工具. 別被一些只會說 domain knowledge 的嘴砲給騙去, 正是因為他們 連基本的工具都掌握不好, 才會拿 domain knowledge 來說嘴. 以網路來說, 如果你能把基本工具用到熟, 你覺得再去學 tcp/ip 會很難嗎? 如果你能看得懂 ethernet driver 裡面一堆指標指來指 去的 descriptor, 難道你沒辦法把網路封包給搞懂嗎? 我不相信一個連 C 都不熟的人, 能看懂 arp table 是怎樣實現的. 萬丈高樓平地起, 勿在浮沙築高台, 要想成為梓人傳裡的梓人, 請 先把基本功練好. 老實說, 這家考的一點都不細節, 我碰過難更多的, 像有的題目是 給你一個程式, 考你變數 compiler 後的輸出, 但其實是要考你知 不知道什麼樣的變數最後會放在 stack 或 bss 裡, 以及 stack 的操作是怎樣的. 如果你要在業界工作, 就請拿出業界的 pro 水準, Devil lives in the details. 這些細節就是用來鑑定專業跟業餘的主要差異. 說一下我的答案, 第一題 compiler 可能會警告你轉型問題, 但你 應該要有一個觀念, 所有的型別都是人為定義的, 對機器來說只有 bit 的差異跟 big endian, little endian 的不同而已. 所以在 C 裡面 char 你要想成是 int8 (bit field). 這也是所謂 的 C laguage data model. 在不同位元的作業系統, 某些型別會 有不同的 bit field, 如 32 bit 與 64 bit 的 int, long 等等, 有興趣請自己去找資料. 以 32 bit OS 為例: char = int8 unsigned char = uint8 short = int16 unsigned short = uint16 int = int32 unsigned int = uint32 在 linux kernel 的 types.h 裡也有定義 int8_t, uint8_t 之類 的類別. 第一個輸出 char 有正負數, char 是 8 bit, 所以範圍是 0~255, 其中負數是從 255 為 -1 開始, 所以答案會是: -(255 - 130 + 1) = -126. 第二個則是 130. 第二題就更明顯了, char* name 沒 allocate heap memory 也沒指 向實際的 data buffer, 一看就知道錯了. 我覺得真正的技術就是在程式語言, 資料結構, 作業系統, 演算法 這些基本到不行的東西! ※ 引述《dickjas (夏天的航海記)》之銘言: : 在下從事程式設計部分也有四五個年頭了 : 目前主要是從事嵌入式系統程式設計 : 程式學了 C/C++,Vb,Java : 網頁部分 html,CSS,Javascript : 資料庫語法也算熟悉 : OS的話 基本上也會Linux操作,架站還有編kernel : 深深認為程式語言不過就是各工具罷了 : 真真的技術不在程式語言,而是想法與寫法流程等 : 第一個學的程式語言相信與大家相同,就是C : 不過最近有去幾家公司面試,其中一家考了相當細節的題目 for C : 類似這種題目 : ----------------------------------- : //題目一 : //輸出結果為何? : #include <stdio.h> : #include <stdlib.h> : int main(int argc, char *argv[]) : { : char c = 130; : unsigned char vc = c; : printf("%d \n",c); : printf("%d \n",vc); : system("PAUSE"); : return 0; : } : ============================================ : //題目二 : //compile哪裡為什麼會出錯 : #include <stdio.h> : #include <stdlib.h> : int main(int argc, char *argv[]) : { : char name1[] = "Niol"; : char name2[4] = "Jack"; : char *name; : //int i; : for(int i=0;i<4;i++ ) name[i]=name1[i]; : name[5]=" "; : for(int i=0;i<4;i++ ) name[5+i]=name1[i]; : system("PAUSE"); : return 0; : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.36.36.117 ※ 編輯: iman00b 來自: 114.36.36.117 (06/18 15:28)
loveme00835:那基本到不行的規格書看過了嗎? 06/18 15:39
iman00b:樓上, 我不懂你在說什麼 spec 跟 datasheet 我整天在看~ 06/18 15:43
loveme00835:你可以看過n1256再回來分享第一題會不會轉型,還有那 06/18 15:59
loveme00835:些整數型態的大小 06/18 15:59
iman00b:你是在說第一題? compiler 會幫你做掉轉型啊~ 06/18 16:40
iman00b:我不是有說這樣寫法是不正確的 所以應該會有警告之類 06/18 16:40
iman00b:但是把 char 當 int8 是實務上很常見到的 06/18 16:41
iman00b:這跟 platform 的定義有關, 當然嚴謹一點要加 type cast 06/18 16:41
iman00b:所以我才提 data model 一樣是 C 在不同平台上差異很大 06/18 16:43
iman00b:不過以出題者的程度 我覺得他想看的答案是我給的 06/18 16:45
loveme00835:什麼轉型啊? 標準又沒說char=signed char,或是char=un 06/18 16:46
loveme00835:signed, sizeof char = 8不代表沒padding 06/18 16:48
loveme00835:範圍根本不能確定,還需要討論下去哦? 06/18 16:50
iman00b:我懂你在講什麼了, 一般實務常見的 char 都是 signed char 06/18 16:50
iman00b:一般實務上的 char 大概都是 8bit~ 06/18 16:51
iman00b:你要說的是 char != signed char != unsigned char 對吧? 06/18 16:52
iman00b:就理論上來說 你是對的! 不過對我這種編碼猴子 我只懂實務 06/18 16:53
loveme00835:那連題目都稱不上,修正sizeof char=1 06/18 16:53
loveme00835:you got it 06/18 16:54
iman00b:void* 各 compiler 實作都不一定一樣了~ 06/18 16:54
iman00b:謝謝你的指導! 我以前只有模糊的概念, 所以我是以實務來說 06/18 16:55
iman00b:不過你跟出題者講這個 大概會說你程度太高 我們請不起 XD 06/18 16:58
loveme00835:@@ 06/18 17:08
CGary:所以業界所謂的pro水準只是拿來說說笑而已...我常常跟某些高 06/18 18:22
CGary:階主管聊天, pro水準不如新人薪資水準:) 06/18 18:22
CGary:不過這跟產業屬性有關 台灣需要的軟體工程師 極端兩極化... 06/18 18:23
twk:這篇開頭反過來寫好像也很順~ 06/18 18:55
leicheong:我認為程設功力和domain knowledge沒相關的必然性. 06/18 22:30
leicheong:程設沒學好就鑽研domain knowledge算不上 06/18 22:31
leicheong:「浮沙築高台」吧... 06/18 22:31
leicheong:然後, 這世上的確有很會C++的但怎樣也弄不明白TCP/IP 06/18 22:33
leicheong:處理規則的人... 06/18 22:34
iincho:我同意樓上,這兩個面向沒有一定的關聯... 06/19 07:40
karcher:樓樓上 可以說說你的產業?? 06/19 09:47
leicheong:我目前是金融業啦, 不過一直以來都在做不同性質的工作. 06/19 16:07