Re: [請益] 有關學習程式語言
你說的沒錯, 程式語言就是工具而已, 但是很多人連工具都用不好.
我的觀念是工欲善其事, 必先利其器, 基本的程式語言技巧是第一
個要掌握的, 其次, 要熟悉所你使用的編程工具.
別被一些只會說 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)
→
06/18 15:39, , 1F
06/18 15:39, 1F
→
06/18 15:43, , 2F
06/18 15:43, 2F
推
06/18 15:59, , 3F
06/18 15:59, 3F
→
06/18 15:59, , 4F
06/18 15:59, 4F
→
06/18 16:40, , 5F
06/18 16:40, 5F
→
06/18 16:40, , 6F
06/18 16:40, 6F
→
06/18 16:41, , 7F
06/18 16:41, 7F
→
06/18 16:41, , 8F
06/18 16:41, 8F
→
06/18 16:43, , 9F
06/18 16:43, 9F
→
06/18 16:45, , 10F
06/18 16:45, 10F
→
06/18 16:46, , 11F
06/18 16:46, 11F
→
06/18 16:48, , 12F
06/18 16:48, 12F
→
06/18 16:50, , 13F
06/18 16:50, 13F
→
06/18 16:50, , 14F
06/18 16:50, 14F
→
06/18 16:51, , 15F
06/18 16:51, 15F
→
06/18 16:52, , 16F
06/18 16:52, 16F
→
06/18 16:53, , 17F
06/18 16:53, 17F
→
06/18 16:53, , 18F
06/18 16:53, 18F
→
06/18 16:54, , 19F
06/18 16:54, 19F
→
06/18 16:54, , 20F
06/18 16:54, 20F
→
06/18 16:55, , 21F
06/18 16:55, 21F
→
06/18 16:58, , 22F
06/18 16:58, 22F
→
06/18 17:08, , 23F
06/18 17:08, 23F
推
06/18 18:22, , 24F
06/18 18:22, 24F
→
06/18 18:22, , 25F
06/18 18:22, 25F
→
06/18 18:23, , 26F
06/18 18:23, 26F
→
06/18 18:55, , 27F
06/18 18:55, 27F
推
06/18 22:30, , 28F
06/18 22:30, 28F
→
06/18 22:31, , 29F
06/18 22:31, 29F
→
06/18 22:31, , 30F
06/18 22:31, 30F
→
06/18 22:33, , 31F
06/18 22:33, 31F
→
06/18 22:34, , 32F
06/18 22:34, 32F
→
06/19 07:40, , 33F
06/19 07:40, 33F
→
06/19 09:47, , 34F
06/19 09:47, 34F
推
06/19 16:07, , 35F
06/19 16:07, 35F
討論串 (同標題文章)
本文引述了以下文章的的內容:
請益
7
26
以下文章回應了本文 (最舊先):
請益
2
12
請益
3
13
請益
1
11
完整討論串 (本文為第 6 之 11 篇):
請益
2
13
請益
2
12
請益
3
13
請益
1
11
請益
4
35
請益
5
20
請益
12
58