優雅的代碼老是讓人賞心悅目,好比下面有兩段代碼,都是實現了相同的功能,當你看完代碼A再來看代碼B時,你是否也有一種身心愉暢的感覺呢。面試
代碼A:ide
1 //若是用戶輸入的是偶數,就直接輸出,不然就+1以後再輸出。 2 int a; 3 printf("請輸入一個數字:"); 4 fflush(stdin); 5 scanf("%d", &a); 6 7 //判斷狀況再輸出 8 if (a % 2 == 0) 9 { 10 printf("結果是:%d\n", a); 11 } 12 else 13 { 14 a = a + 1; 15 printf("結果是:%d\n", a); 16 }
代碼B:spa
1 //若是用戶輸入的是偶數,就直接輸出,不然就+1以後再輸出。 2 int a; 3 printf("請輸入一個數字:"); 4 fflush(stdin); 5 scanf("%d", &a); 6 7 //輸出結果 8 printf("結果是:%d\n", a + a % 2);
讓9行代碼變成1行代碼,卻依然能實現相同的功能,有着四兩撥千斤的味道,優雅感也就這麼產生了。code
然而,是否代碼越少就越優雅呢?大部分狀況下是的,但並不絕對,盲目的追求每每拔苗助長,最顯而意見的例子就是下面這段代碼。orm
1 //請問如下代碼會輸出什麼結果 2 int a = 0; 3 int i = 2; 4 a = (++i) + (++i) + (++i); 5 printf("%d\n", a);
其實今天主要就是想聊聊上面這段代碼,很多企業的面試題中就常常會出現相似這樣子的題目,我我的認爲在面試題中出現這種題目的企業他們有着一個不負責任、不做爲的人事部或者技術部。blog
爲何要考這種題目,我認爲有三個緣由:ci
1.在咱們公司,這種代碼被認爲是優雅的、高效的代碼,公司現有的程序中編寫了此類代碼,咱們要求新加入的成員能閱讀這種代碼,甚至是在未來加入公司後,新成員也能寫出這種代碼。編譯器
2.在咱們公司,咱們認爲這種濃縮代碼是晦澀難懂的,因此並不優雅,或者說是僞優雅。雖然咱們並不會在實際的項目中編寫此類代碼,也不會要求新員工在加入公司以後來編寫此類代碼,但咱們依然將它加入到面試題中,由於咱們但願新員工是一名技能好手,爛熟於胸的掌握操做符的優先順序或許能必定程度上的說明部分問題。it
3.在咱們公司,面試題都是下載來的,或者歷史遺留下來的,那種題目看起來就很高大上,能夠顯得咱們公司也高大上,就留着吧。io
遺憾的是,大部分企業是第三個緣由吧。
代碼變少,卻依然能實現相同功能,天然是很棒。但真的依然能實現相同功能嗎?通過試驗發現,上面的這段代碼,在不一樣的編譯器下獲得的結果是不一樣的。
l 在VS2010中新建VC++控制檯項目,運行的結果爲:15
先讓三個++i執行,i就變成了5,而後5+5+5=15
l 在VC++6.0中新建Win32控制檯項目,運行的結果爲:13
爲何結果是13,我也沒理解,求大神科普
l 在VS2010中新建C#控制檯項目,運行的結果爲:12
先++i就獲得3,再++i就獲得4,再++i就獲得5
而後3+4+5=12
在VC++6.0的時代,出現這種面試題,無可厚非。但時代在變化,當今還考(++i)+(++i)+(++i)就顯得不太合適了,由於在不一樣的編譯器下,將會獲得不一樣的結果。
若是是由於第2個緣由,想找技能好手而將此類題目加入面試題中,那這得是一個多麼好的好手,才能準確的回答出此題呢?我想標準答案應該是這樣的:「此題在VC++6.0中輸出13;在VS2010中用C++輸出15;用C#輸出:12;」,而後再附上各類結果的計算過程。我想這種好手應該不多,若是真在面試題中加入這個題目,企業不但找不到頂尖好手,反而會錯過不少通常般、還能夠的好手。
若是是由於第1個緣由,想找到能寫出優雅代碼的小夥伴,那就更加不靠譜了,由於首先,這種代碼並非優雅的,由於它根本沒有「實現相同功能」,在不一樣編譯器下結果是不一樣的。
結論:將代碼濃縮的更少,卻依然能實現相同的功能,大部分狀況下這是優雅的作法,但要考慮兩點,一是不能讓代碼變得特別晦澀難懂,二是要避免在不一樣編譯器下出現不一樣的結果。
PS:或許有些偏題了,水平有限,不吝賜教。