Re: [討論] 紙筆考試
※ 引述《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
01/03 16:30, 1F
→
01/03 16:30, , 2F
01/03 16:30, 2F
推
01/03 19:16, , 3F
01/03 19:16, 3F
→
01/03 19:43, , 4F
01/03 19:43, 4F
※ 編輯: neutrino 來自: 219.87.142.18 (01/03 19:45)
→
01/05 11:41, , 5F
01/05 11:41, 5F
推
01/05 12:52, , 6F
01/05 12:52, 6F
討論串 (同標題文章)