Re: [討論] 紙筆考試

看板Soft_Job作者 (十年一夢)時間13年前 (2013/01/03 15:18), 編輯推噓3(303)
留言6則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《ficecmiraror (秘密ID)》之銘言: : 標題: [討論] 紙筆考試 : 時間: Wed Jan 2 15:23:11 2013 : : 最近在找工作 : 遇到不少感覺就是要考倒人的筆紙考試= =" : 例如 : : int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; : : //a傳入其他function後 : : a++; : : //回到main function : : 問你a[1][1]和a[2][2]是多少 : : ----另一個例子---- : : char *a="abcdefghijklmnop"; : : 問你 printf("%c",*((long)a+1)); : 他是考C 還是C++? 在這幾個問題裡剛好C/C++不太有差, 以下當成C++討論 (1) 1. 我覺得這不是刁難, 這只是要問call by value的觀念. 2. 如果code長成這樣, g++和vc++都compile的過. 這沒問題. #include <cstdio> void func( int a[][3] ) { a++; } int main() { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; func ( a ); printf ( "%d, %d \n", a[1][1], a[2][2] ); return 0; } 輸出當然是5, 8 (sorry typo, 是5, 9) # edit 如果 void func ()裡面有把值assign進a[1][1]過, 或類似的操作 (例如 a++; a[0][1] = 100;) 那輸出才會是其他值. (2) 1. 這行 char *a="abcdefghijklmnop"; 這個不是很好, 如果a 之後內容不需要修改, 應寫成 const char *a = "abcdefghijklmnop"; 如果a 之後內容需要修改, 那 char *a="abcdefghijklmnop" 應寫成明確的allocate char * a, 然後將"abcdefghijklmnop"這個string constant複製進去, 然後小心維護a的生命週期. 又或者使用std::string. 有興趣的話可以trace compiler生出來的assembly 看他怎麼處理string literals. vc++ 可以用option /GF, 重複的string constant在編譯出來的PE檔裡只會有一份(放在.rdata section) 2. 撇開1.的對題目的吐嘈, char *a="abcdefghijklmnop"; 在g++和vc++都能compile. 在g++(after 4.3??) 你會得到一個warning 叫你用const char* 3. *((long)a+1) 這個地方才會有問題. 括號內的部份 type會是long, 不是任何pointer type; 此值再用 *去dereference, error. 沒看到題目, 題目本意有可能是 a) *((long*)a+1) b) *(char*)((long)a+1) 不論改成a)或b), 都可以compile過, 但是意義不同. a) 若 long * tmp = (long*) a; 則 *((long*)a+1) 相當於 tmp[1]; big/little endian接 第4點 b) *(char*)((long)a+1) 如果這個機器上的sizeof(long) >= sizeof(char*), 則相當於a[1] (印出'b'); 否則, access violation, 或者無法預期的結果, 或者(剛巧a的值<MAX_LONG)印出a[1]. 4. 接3-a)的情形 假定這個環境sizeof(long)==4 *((long*)a+1) 會拿到"efgh" 這是對的, 但是little endian的話"efgh"是解讀成 'h' * 0x1000000 + 'g' * 0x10000 + 'f' * 0x100 + 'e' 才對 如此一來printf %c 會印出的是'e' (3) 我覺得比較不合理的大概是招java的人, 卻考C++. 考題本身用紙筆測驗我覺得ok. (1)是基本傳引數的觀念, (2)我除了用char *去接 string literal結果是error還是warning不確定, 其他也不需要上機才會做或查書 才知道. 這兩題大概都是想知道受試者對指標的觀念. 雖然不是平常會有的寫法, 但是這樣 出題算還行吧. 比起為了考operator的執行順序而出 k = i++++++j這種晦澀語句, 還ok. : ◆ From: 114.27.83.159 : 推 LaPass:因為這應該是C之類有指標的語言.... 01/02 15:25 : → LaPass:第一個a++是把指標加一,等於整個陣列移一格。但是因為改 01/02 15:26 : → LaPass:的是指標,所以回到main function後是不變的。 (好像是這樣 01/02 15:26 : → LaPass:我也不知道很多公司在想啥..... 都在幹很奇怪的事..... 01/02 15:28 : 推 ccpz:至少現在比較少見到 i++++了 01/02 16:14 : 推 welltrendlee:華X...莫名其妙的筆試內容… 01/02 17:45 : 推 SansWord:k = i+++++++j, 請問i, j, k 各為多少 01/02 18:27 : → SansWord:出這種題目,也許要找出吐槽題目的人吧。 01/02 18:28 : 推 littlethe:如果是刁難人的筆試,那就沒有鑑別度了 01/02 18:57 : 推 f1234518456:說不定已經離開的人跟公司有仇 都這樣寫的... 01/02 19:06 : → andymai:應徵Java卻考這個也太奇怪了吧... 01/02 19:34 : 推 cobrasgo:應徵java考這個是蠻奇怪,不過這算是基本的c題目就是 01/02 21:20 : 推 cobrasgo:第一個題目會不會變要看怎麼傳和傳進去做什麼事 01/02 21:22 : → cobrasgo:第二個你就直接寫死給你看就好了 01/02 21:23 : → EdisonX:第二題應該是 *((long*)a+1), 大概是 'h' 吧 01/02 21:28 : 推 Ahshiung:請問第二題要怎麼看? 我是初學者QQ 01/02 21:30 : 推 cobrasgo:long的話要看在哪種model下吧,有的32有的64 01/02 21:31 : → cobrasgo:我是指若轉型成long*的話 01/02 21:32 : → EdisonX:oh 對唷,太多可攜問題了,還有我也假定了是 little endian. 01/02 21:36 : → EdisonX:@Ahsh~ 第二題說來話長.. (long*)a, 將a看成 ptr to long 01/02 21:38 : 推 cobrasgo:反正依照原題目就是死給你看,不用幫他假設是筆誤了XD 01/02 21:39 : → EdisonX:(long*)a+1,移動一個 long 大小 (移到 "efgh" 了) 01/02 21:39 : → EdisonX:*((long*)a+1) , 依 little endian 取出 "efgh" 01/02 21:39 : → EdisonX:@@ sorry, 抱歉, 我雞婆了, 想說這兩題我算常遇到. 01/02 21:41 : 推 Ahshiung:感謝樓上解答QQ 01/02 21:42 : → ficecmiraror:我當時因為太久沒寫C(上一份工作JAVA)~所以忘了 01/02 21:43 : → ficecmiraror:EDISONX的解法~@@~ 01/02 21:43 : 推 EdisonX:我的解法只是鳥仔屎,還是如 cobrasgo 所說,這題目太多 01/02 21:44 : → EdisonX:前提假設沒給就是了。 01/02 21:44 : → ficecmiraror:他的考試是有說LONG多長就是了 01/02 21:45 : → EdisonX:所以最後還是要假定是 Big / Little Endian. 01/02 21:47 : 推 ah7675:麊虃gC的應該不難 也許該職位需要用到JNI? 也可能只是亂搞 01/02 21:47 : → EdisonX:( 說不定他的機台是 middle / mix endian 也不一定 @@) 01/02 21:47 : → ah7675:常寫 01/02 21:47 : 推 ninepoints:覺得不會過就直接寫,我也遇過題目根本太舊的筆試 01/02 23:51 : → ninepoints:改考卷的是人不是讀卡機,盡量表達你的變通性跟專業 01/02 23:51 : 推 Adonisy:高考就是紙筆考啊,看招到什麼人才進來... 01/03 01:15 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.142.18

01/03 16:30, , 1F
考java卻出c++的題真的很搞笑,這些在c++很常見,但對
01/03 16:30, 1F

01/03 16:30, , 2F
熟java不熟c++的人就會稍微傷腦筋了
01/03 16:30, 2F

01/03 19:16, , 3F
第一個是5, 9吧
01/03 19:16, 3F

01/03 19:43, , 4F
啊 你是對的 typo
01/03 19:43, 4F
※ 編輯: neutrino 來自: 219.87.142.18 (01/03 19:45)

01/05 11:41, , 5F
怎麼看都是要考C吧....XD
01/05 11:41, 5F

01/05 12:52, , 6F
感謝解答!!非常清楚
01/05 12:52, 6F
文章代碼(AID): #1GvJ2in7 (Soft_Job)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
文章代碼(AID): #1GvJ2in7 (Soft_Job)