A. System.err 和System.out的怪異運行!
大多數操作系統都有三個標准文件描述符:標准輸入,標准輸出,標准出錯。
三個操作系統的文件描述符映射到編程語言的標准庫中,往往加了一層包裝,但是名字通常還是叫標准輸入,標准輸出,標准出錯。
在其它語言中的一般寫法是:stdin,stdout,stderr(有的語言里大寫,有的語言里小寫)。對應java中的System.in,System.out,System.err。
在語言層面的實現三個文件描述符都是可以重定向的(只要你想)。但是一般而言,如果你在unix shell或windows command line中使用管道或重定向,則只是針對標准輸入和輸出。
另外,標准輸出和標准出錯的一個區別是,標准輸出往往是帶緩存的,而標准出錯沒有緩存(默認設置,可以改)。所以如果你用標准出錯列印出來的東西可以馬上顯示在屏幕,而標准輸出列印出來的東西可能要再積累幾個字元才能一起列印出來。如果你在應用中混用標准輸出和標准出錯就可能看到這個問題。
總的來說,System.out用於正常的輸出,也就是程序真正想輸出的內容。而System.err用於出錯信息的輸出,也就是你本來不期待看到的東西。
因此,System.err打出來的信息常常會跑到System.out信息的前面去。。。
B. 編程語言的學習方法
首先:我學編程已經有快兩年的時間了,我的專業和計算機編程一點也沾不上邊(圖書館學專業本科)。從最初的C-〉C++-〉VC++6.0-〉VC++.NET託管編程 + SQL Server
要學編程不是一朝一夕的事,不知道你有多少的時間和毅力,編程要學到通最重要的就是方式就是自學,老師教不了多少東西,如果一個老師能夠讓你入門一門語言就已經是很不錯了。
個人覺得最好是從C/C++學起當你對C++很懂的時候,就可以學習VC++了,VC++是學習Windows最好的編程語言,如果你VC++學得通了Windows系統編程就不再話下了.如果這時候比如要改行到C# / Java 這些對你來說都是幾周就能夠上手的事.而且學習C++有一個很好的地方就是C++的書籍非常的多,經典書籍也很多你學習起來會給你非常多的幫助.
當然如果你選擇了C++你一定要有毅力與恆心,現在很多的院校都是直接開C# 而不是開VC++課程就是因為VC++的難度大,正式因為難度大就更需要毅力了!如果你沒有這個就最好不要選擇VC++,還有如果你不是想把編程當作未來的工作方向建議不要學VC++,像開發什麼網站的舊直接去學JAVA或C#/ASP就好了,容易上手難度也不會那麼大,這時我個人的經歷.
下面賦上我保存的一個文章,如果你准備學期VC++,可你看看:
學好VC++的十大良好習慣
歡迎光臨阿蒙的VC++專業技術網站:http://www.vchome.net/
每到年底各大媒體就爭先恐後熱火朝天地搞總結,什麼十大人物,十大品牌,十大美女,十大帥哥等等五花八門亂七八糟的讓人充滿好奇充滿懷疑,這事確實讓人有點郁悶,就如同男足國家隊的國產教練如沈牆扶們每一次踢球失敗後都要說這么一句:我們回去後要好好總結,下次會打得更好! 這話聽了幾十年了,耳朵都生蟲了,但還是無法看到中國豬球隊有象人樣的表現.因此,總結在某一程度上來說只不過是一種形式罷了,總結不代表就能改過原有的不足,也不代表就能進步了,甚至有點俗不可耐,盡管如此,阿蒙亦明知故俗,前人說過了入鄉了就要隨俗,因此你生活在這種環境里,你無法對這些無聊無趣的東東置之不理,除非你是天才,天才往往在非天才的人看來是很怪異的,處處與現實格格不入,可阿蒙不是天才,所以還得趕快總結,要不就離題,又被大家罵了,:)
(一)充分利用MSDN,因為我個人覺得它勝過任何一本編程參考書;
MSDN是 Microsoft 當前提供的有關編程信息的最全面的資源,它包含微軟最新的技術資料庫,加上易學易用的全文檢索功能,讓您迅速找到任何您需要的技術參考數據,讓您隨時擁有與全世界菁英同步的技術,掌握最豐富的程序開發資源。我經常收到很多朋友的EMAILS,他們所提的問題往往都非常的簡單,MSDN完全可以解答這些問題,但他們好象不太喜歡用,這是讓我郁悶的地方,是因為英文不好呢,還是沒有學會充分利用各種資源來解決問題的方法呢?
(二)提高英文水平,養成多上英文網站多看英文資料多買老外原版英文書;
有關程序員與英文水平的討論已太多太多, 我個人認為要成為程序員,高中的英語水平夠了,甚至不懂英語的一些人,也同樣可以成為較好的程序員,因為開發工具的發展將是越來越傻瓜,但如果你是僅僅滿足於能運用某種工具開發某個軟體模塊,那是沒話說了.真正熱衷技術肯干鑽研樂於接受挑戰的程序員是不滿足於現狀的,他們總感覺有太多的未知,於是總在不停地學習,如今信息技術發展得太快,而大部分的技術最先出現的時候都是英文版本的,要幾個月或者幾年以後才有中文版本的書出來,因此要想跟上步伐,一定要努力提高自己的英文水平,這樣才能同步跟上信息技術。你可能擔心自己的英語水平不行,沒關系,剛開始多查字典,"萬事開頭難",必須有持之以恆的精神,不久你就會發現計算機英語其實很容易的。何況很多
英文技術站點確實比國內做得好啊!比如http://www.codeguru.com,http://www.codeproject.com, http://www.programmersheaven.com 等等.
(三)加強自我管理,善於作自我總結,分析自已的優點及缺點。
中國境內百分之八十以上的領導人在百分之八十以上的場合的講話中都有類似的觀點,所以在這里我是不多說了,反正這一條用在什麼行業什麼地方都不會有錯的,人生最大的敵人不是就是自已嗎?管好自已認清自已,那還有什麼搞不定的?
(四)養成良好的文檔習慣
程序員大多都不喜歡寫文檔,我以前也是特討厭,在我的思想里,所謂的文檔就是一些廢話,一句話硬是用十句話來代替的無聊透頂,就如同部分中文系男生的愛情表白,明明就是"我愛你"三個字,他硬是把月亮啊太陽啊大海啊高山啊石頭啊天使啊亂七八糟的都拉上關系了,盡管聽起來浪漫,但在我認為不實用,:), 甚至太肉麻了,一個男子漢幹嘛這么羅里羅嗦的......良好的文檔是正規研發流程中非常重要的環節,一個好的程序是先寫好設計文檔再進行編程的,在設計文檔的指導下,才能寫出安全的代碼。如果你不寫文檔,一開始就寫程序,這樣你就不會按已設計好的路線走,而是想到哪寫到哪。小功能還好說,要是大功能,就容易混亂甚至失控.那麼如何寫文檔呢?其實我認為沒有統一的標准,雖然國家及一些NB的人總結了很多的模板,但每個人的習慣不同,如果你不加以修改或創新,就套用某個標准,我相信寫起來會很吃力及說不清的難受,因此我覺得只要能將你的設計思想及實現演算法或步驟描述清楚就是好的文檔,我強烈建議廣大程序員朋友們在寫文檔時要善於用圖表來說明你的思想,我們不是作家,也可能作文都經常性地不及格,寫出五官端正的文章對我們來說可能不容易啊!好好地利用VISIO,ROSE或別的工具來表達你的思想吧!
(五)代碼風格要規范,嚴謹,效率要高。
這個不用說了,所以一定要記住了!不過,這一點有時可能與人的性格有關,如果你是經常丟三落四經常鬍子長長經常鈕扣扣錯經常吃個快餐要一個小時的人,那你在CODING的時候可千萬要注意了,CODING是CODING,生活是生活,不要寫出的程序也是那樣就不好了!
(六)掌握好跟蹤調試技巧.
跟蹤調試程序是一件繁瑣而又復雜的事情,所以掌握必要的調試策略及技巧卻可以使這些工作變得輕鬆起來.強烈建議你去看一下老美Everett N.McKay及Mike Wooding寫的書<<Debugging Windows Programs>>,你一不定受益匪淺.
(七)養成自我測試的習慣
測試工作應由測試工程師來做,但在你寫完一個模塊或一個軟體時,還是要自已先測試一下,保證不要出現一些低級的錯誤,何況這些錯誤讓測試工程師看到了,狂扁你一頓,你很沒FACES的.
(八)善於交流善於溝通,特別是經常與一些高手交流一下學習的心得體會;
有人說,程序員的性格大多內向不喜歡說話,其實是有些誤會了,不是不喜歡而是話不投機,我的腦袋一天到晚都在不停地轉,函數,數據,演算法啊充滿了我的世界,我那還有時間與你談一些無聊的話題,話要找對人了,才容易談下去,書上說過"聽君一席話,勝讀十年書",你要找的就是這種豁然開朗!現在技術的論壇越來越來,這將成為程序員交流一個重要的地方,也有人說:"讀君一長貼,勝讀十年書",:)
(九)階段性地做一下專題總結
知識要溫故而知新,因此我建議程序員要養成階段性地做專題總結的習慣,比如你這個月學習或在做與多線程有關的模塊或項目,那麼在你做完後,你就可以好好地總結一下所有與多線程相關的技術,包括理論知識,實踐方法以及各種技巧及優秀文章等等,這對你各種能力的提高將有很大的幫助,你試過了嗎,如果沒有,那就快點行動吧!
(十)要有持之以恆的精神
這是廢話,因為我揍不齊十大,所以將它也算上,中國自古以來喜歡號召大眾學習某種精神,比如馬克思的,列寧的,毛澤東的,鄧小平的,雷峰的等,這些精神使社會更安定人民生活更美好,那麼程序員要有什麼樣的精神呢?我不是我說了就算了的,我只是想說明要學好任何一門技術,最好要有持之以恆精益求精的精神,特別是學一些比較抽象比較難的技術,比如VC++,我想它應比別的開發語言都要難學些,或許你已經開始了兩年了,但感覺還是不爽彷彿也沒掌握什麼,這個時候你除了思考一下你的學習方法以外,還必須堅定你的目標及信念!
C. 如何學習編程語言
個人大學本科學的是軟體工程,學過幾門編程語言(C/C++/php/Java/Python),下面結合一下個人的學習經驗來談一下這個問題。
我覺得想要學好一門編程語言,需要經過如下幾個步驟:
基本語法
其實除非這門語言特別怪異,比如LISP,大多數語言的基本語法都是大同小異的。在初次接觸到一門新的編程語言時,我們需要快速的掌握這門語言的基本語法,比如變數聲明、if條件、循環條件、數組、字元串、最常用的函數等。
如何快速掌握基本語法呢?我一般會上網找一些快速入門的教程,這些教程最好伴隨一些簡單的練手例子。
語言的差異(坑)
任何一門語言都有自己與眾不同的地方,很可能這種語言的一些用法與自己的經驗相悖,那麼我們如何快速的掌握這門語言有哪些坑呢?我自己的做法是上網搜這門語言的面試題。面試題一般包括這門語言的常見用法技巧、坑。通過練習面試題,我們能get到語言的坑,而不是在實際的項目中踩坑。
系統的學習
上面兩種學習方法,有一個很明顯的缺點,就是我們沒有對這門語言形成一個知識體系,只是類似於打補丁的方式,學習的東西浮於表面。想要系統的學習這門語言,我們需要買一本關於這門系統講解這門語言的書籍。這樣有2個好處:第一個是進一步拓展你的知識面,第二個是利於你語言知識結構的形成。
當然,如果不想買書的話,我們可以看這么語言的手冊,手冊上也有很多關於這門語言的技巧和注意點。如果英語好的話,最好看英文版的手冊,哈哈。
下面是我覺得比較好的系統學習語言的書籍:
C:C程序設計語言
練兵
光看書是不能學好一門編程語言的。看書學到的知識只是在你的腦子里留下了一個初步的印象,但是沒有深入骨髓,沒有自己的理解。所以為了對知識有自己的深入理解,我們需要做一兩個實際的小項目,這個項目最好是能解決某一類問題的,不能是那種做出來沒有實際意義的項目。
如果可以的話,最好項把目放在github上開源。如果有人用的話那就更好了,大家會看你寫的代碼,甚至會和你進行討論,這個時間段將是你提高最快的時候,保不準你的項目就是下一個Linux呢,哈哈。
D. 碰見一個怪異的C語言編程題 關於字元串操作
如果p指向『\0』,而且n也不代表字元串長度.
唯一的辦法就是指針--,直到程序崩潰,就可以找到起始位置,可能也找不到。
我見過這個題目,但題目沒說指針指向『\0』;
E. 你接觸過的編程語言里有哪些你覺得很奇怪的功能
reMorse 語言旨在使代碼看起來像莫爾斯碼……(why?
reMorse 包含四條指令。dash( - )和 dasher( - 後跟空格)指令分別從七個操作的循環列表中選擇下一個和上一個操作。dot(。)和 dotty(。後面跟一個空格)分別進行操作和正在選擇的操作的相反操作。
F. 會那些演算法,就能C語言編程了嗎誰能告訴我為什麼我看到的演算法怪異的編程跟系統都不搭邊呢
那是因為別人幫你做好了各種類,通過繼承類能實現各種功能,但是底層的東西是別人幫你做好的,底層就可能會用到這些演算法。
G. 有沒類似php語法的編程語言 java/c語言C++/C#
去認真學就好,無論學一門還是多學。
像C#,也可以在Linux下開發,Mono框架也非常強大了,使得ASP.net方面幾乎100%兼容
Winform也大半兼容了。也有特有GTK框架,開發桌面、網站完全夠。
不聲明類型,也是有利有弊的。對於純文本的環境常常便利一些。
像C#語言,以前要string t="hello world"現在新引入了var t="hello world";這樣自動變數類型的寫法。
C/C++肯定也可以返回數組,通常根本不用返回,傳2個地址進去就行了
foo(int *a, int *l); //指針a代表數組,指針l代表數組長度,在函數中改變內容,不需要返回。
語言都有優點和缺點的。
像js,沒有真正意義整數運算,都用64bit的double浮點數進行運算,會導致數值編碼計算性能降低太多。缺乏對utf8以外編碼的支持,缺乏整數又讓任何編碼效率很低
PHP的整數,不支持無符號位移,使得手動實現某些常用演算法,比如寫個CRC32編碼,TEA編碼變得非常怪異和性能降低。100層的遞歸限制等等。只適合寫組合流程,而想實現常用編碼演算法和創造新編碼演算法將很被約束。
總之認真去學,環境下遇到問題肯定就近也有解決方法。
H. 在《軟體故事》中說Lisp想比FORTRAN是個巨大的進步。請問,Lisp比FORTRAN高級在哪
一、
如果我們把流行的編程語言,以這樣的順序排列:Java、Perl、Python、Ruby。你會發現,排在越後面的語言,越像Lisp。Python模仿Lisp,甚至把許多Lisp黑客認為屬於設計錯誤的功能,也一起模仿了。至於Ruby,如果回到1975年,你聲稱它是一種Lisp方言,沒有人會反對。編程語言現在的發展,不過剛剛趕上1958年Lisp語言的水平。
二、
1958年,John McCarthy設計了Lisp語言。我認為,當前最新潮的編程語言,只是實現了他在1958年的設想而已。
這怎麼可能呢?計算機技術的發展,不是日新月異嗎?1958年的技術,怎麼可能超過今天的水平呢?
讓我告訴你原因。
這是因為John McCarthy本來沒打算把Lisp設計成編程語言,至少不是我們現在意義上的編程語言。他的原意只是想做一種理論演算,用更簡潔的方式定義圖靈機。
所以,為什麼上個世紀50年代的編程語言,到現在還沒有過時?簡單說,因為這種語言本質上不是一種技術,而是數學。數學是不會過時的。你不 應該把Lisp語言與50年代的硬體聯系在一起,而是應該把它與快速排序(Quicksort)演算法進行類比。這種演算法是1960年提出的,至今仍然是最 快的通用排序方法。
三、
Fortran語言也是上個世紀50年代出現的,並且一直使用至今。它代表了語言設計的一種完全不同的方向。Lisp是無意中從純理論發展 為編程語言,而Fortran從一開始就是作為編程語言設計出來的。但是,今天我們把Lisp看成高級語言,而把Fortran看成一種相當低層次的語 言。
1956年,Fortran剛誕生的時候,叫做Fortran I,與今天的Fortran語言差別極大。Fortran I實際上是匯編語言加上數學,在某些方面,還不如今天的匯編語言強大。比如,它不支持子程序,只有分支跳轉結構(branch)。
Lisp和Fortran代表了編程語言發展的兩大方向。前者的基礎是數學,後者的基礎是硬體架構。從那時起,這兩大方向一直在互相靠攏。 Lisp剛設計出來的時候,就很強大,接下來的二十年,它提高了自己的運行速度。而那些所謂的主流語言,把更快的運行速度作為設計的出發點,然後再用超過 四十年的時間,一步步變得更強大。
直到今天,最高級的主流語言,也只是剛剛接近Lisp的水平。雖然已經很接近了,但還是沒有Lisp那樣強大。
四、
Lisp語言誕生的時候,就包含了9種新思想。其中一些我們今天已經習以為常,另一些則剛剛在其他高級語言中出現,至今還有2種是Lisp獨有的。按照被大眾接受的程度,這9種思想依次是:
1. 條件結構(即"if-then-else"結構)。現在大家都覺得這是理所當然的,但是Fortran I就沒有這個結構,它只有基於底層機器指令的goto結構。
2. 函數也是一種數據類型。在Lisp語言中,函數與整數或字元串一樣,也屬於數據類型的一種。它有自己的字面表示形式(literal representation),能夠儲存在變數中,也能當作參數傳遞。一種數據類型應該有的功能,它都有。
3. 遞歸。Lisp是第一種支持遞歸函數的高級語言。
4. 變數的動態類型。在Lisp語言中,所有變數實際上都是指針,所指向的值有類型之分,而變數本身沒有。復制變數就相當於復制指針,而不是復制它們指向的數據。
5. 垃圾回收機制。
6. 程序由表達式(expression)組成。Lisp程序是一些表達式區塊的集合,每個表達式都返回一個值。這與Fortran和大多數後來的語言都截然不同,它們的程序由表達式和語句(statement)組成。
區分表達式和語句,在Fortran I中是很自然的,因為它不支持語句嵌套。所以,如果你需要用數學式子計算一個值,那就只有用表達式返回這個值,沒有其他語法結構可用,因為否則就無法處理這個值。
後來,新的編程語言支持區塊結構(block),這種限制當然也就不存在了。但是為時已晚,表達式和語句的區分已經根深蒂固。它從Fortran擴散到Algol語言,接著又擴散到它們兩者的後繼語言。
7. 符號(symbol)類型。符號實際上是一種指針,指向儲存在哈希表中的字元串。所以,比較兩個符號是否相等,只要看它們的指針是否一樣就行了,不用逐個字元地比較。
8. 代碼使用符號和常量組成的樹形表示法(notation)。
9. 無論什麼時候,整個語言都是可用的。Lisp並不真正區分讀取期、編譯期和運行期。你可以在讀取期編譯或運行代碼;也可以在編譯期讀取或運行代碼;還可以在運行期讀取或者編譯代碼。
在讀取期運行代碼,使得用戶可以重新調整(reprogram)Lisp的語法;在編譯期運行代碼,則是Lisp宏的工作基礎;在運行期編 譯代碼,使得Lisp可以在Emacs這樣的程序中,充當擴展語言(extension language);在運行期讀取代碼,使得程序之間可以用S-表達式(S-expression)通信,近來XML格式的出現使得這個概念被重新"發 明"出來了。
五、
Lisp語言剛出現的時候,它的思想與其他編程語言大相徑庭。後者的設計思想主要由50年代後期的硬體決定。隨著時間流逝,流行的編程語言不斷更新換代,語言設計思想逐漸向Lisp靠攏。
思想1到思想5已經被廣泛接受,思想6開始在主流編程語言中出現,思想7在Python語言中有所實現,不過似乎沒有專用的語法。
思想8可能是最有意思的一點。它與思想9隻是由於偶然原因,才成為Lisp語言的一部分,因為它們不屬於John McCarthy的原始構想,是由他的學生Steve Russell自行添加的。它們從此使得Lisp看上去很古怪,但也成為了這種語言最獨一無二的特點。Lisp古怪的形式,倒不是因為它的語法很古怪,而 是因為它根本沒有語法,程序直接以解析樹(parse tree)的形式表達出來。在其他語言中,這種形式只是經過解析在後台產生,但是Lisp直接採用它作為表達形式。它由列表構成,而列表則是Lisp的基 本數據結構。
用一門語言自己的數據結構來表達該語言,這被證明是非常強大的功能。思想8和思想9,意味著你可以寫出一種能夠自己編程的程序。這可能聽起來很怪異,但是對於Lisp語言卻是再普通不過。最常用的做法就是使用宏。
術語"宏"在Lisp語言中,與其他語言中的意思不一樣。Lisp宏無所不包,它既可能是某樣表達式的縮略形式,也可能是一種新語言的編譯器。如果你想真正地理解Lisp語言,或者想拓寬你的編程視野,那麼你必須學習宏。
就我所知,宏(採用Lisp語言的定義)目前仍然是Lisp獨有的。一個原因是為了使用宏,你大概不得不讓你的語言看上去像Lisp一樣古 怪。另一個可能的原因是,如果你想為自己的語言添上這種終極武器,你從此就不能聲稱自己發明了新語言,只能說發明了一種Lisp的新方言。
我把這件事當作笑話說出來,但是事實就是如此。如果你創造了一種新語言,其中有car、cdr、cons、quote、cond、 atom、eq這樣的功能,還有一種把函數寫成列表的表示方法,那麼在它們的基礎上,你完全可以推導出Lisp語言的所有其他部分。事實上,Lisp語言 就是這樣定義的,John McCarthy把語言設計成這個樣子,就是為了讓這種推導成為可能。
六、
就算Lisp確實代表了目前主流編程語言不斷靠近的一個方向,這是否意味著你就應該用它編程呢?
如果使用一種不那麼強大的語言,你又會有多少損失呢?有時不採用最尖端的技術,不也是一種明智的選擇嗎?這么多人使用主流編程語言,這本身不也說明那些語言有可取之處嗎?
另一方面,選擇哪一種編程語言,許多項目是無所謂的,反正不同的語言都能完成工作。一般來說,條件越苛刻的項目,強大的編程語言就越能發揮 作用。但是,無數的項目根本沒有苛刻條件的限制。大多數的編程任務,可能只要寫一些很小的程序,然後用膠水語言把這些小程序連起來就行了。你可以用自己熟 悉的編程語言,或者用對於特定項目來說有著最強大函數庫的語言,來寫這些小程序。如果你只是需要在Windows應用程序之間傳遞數據,使用Visual Basic照樣能達到目的。
那麼,Lisp的編程優勢體現在哪裡呢?
七、
語言的編程能力越強大,寫出來的程序就越短(當然不是指字元數量,而是指獨立的語法單位)。
代碼的數量很重要,因為開發一個程序耗費的時間,主要取決於程序的長度。如果同一個軟體,一種語言寫出來的代碼比另一種語言長三倍,這意味 著你開發它耗費的時間也會多三倍。而且即使你多雇傭人手,也無助於減少開發時間,因為當團隊規模超過某個門檻時,再增加人手只會帶來凈損失。Fred Brooks在他的名著《人月神話》(The Mythical Man-Month)中,描述了這種現象,我的所見所聞印證了他的說法。
如果使用Lisp語言,能讓程序變得多短?以Lisp和C的比較為例,我聽到的大多數說法是C代碼的長度是Lisp的7倍到10倍。但是最 近,New Architect雜志上有一篇介紹ITA軟體公司的文章,裡面說"一行Lisp代碼相當於20行C代碼",因為此文都是引用ITA總裁的話,所以我想這 個數字來自ITA的編程實踐。 如果真是這樣,那麼我們可以相信這句話。ITA的軟體,不僅使用Lisp語言,還同時大量使用C和C++,所以這是他們的經驗談。
根據上面的這個數字,如果你與ITA競爭,而且你使用C語言開發軟體,那麼ITA的開發速度將比你快20倍。如果你需要一年時間實現某個功能,它只需要不到三星期。反過來說,如果某個新功能,它開發了三個月,那麼你需要五年才能做出來。
你知道嗎?上面的對比,還只是考慮到最好的情況。當我們只比較代碼數量的時候,言下之意就是假設使用功能較弱的語言,也能開發出同樣的軟 件。但是事實上,程序員使用某種語言能做到的事情,是有極限的。如果你想用一種低層次的語言,解決一個很難的問題,那麼你將會面臨各種情況極其復雜、乃至 想不清楚的窘境。
所以,當我說假定你與ITA競爭,你用五年時間做出的東西,ITA在Lisp語言的幫助下只用三個月就完成了,我指的五年還是一切順利、沒有犯錯誤、也沒有遇到太大麻煩的五年。事實上,按照大多數公司的實際情況,計劃中五年完成的項目,很可能永遠都不會完成。
我承認,上面的例子太極端。ITA似乎有一批非常聰明的黑客,而C語言又是一種很低層次的語言。但是,在一個高度競爭的市場中,即使開發速度只相差兩三倍,也足以使得你永遠處在落後的位置。
I. C語言編程,怪異的執行結果(順序):printf("%d,%d",(a++,--b),b-1);}。附匯編指令截圖。
在一個表達式中的先後順序與在一個語句中的先後順序不完全一樣,特別是這個多參數函數的調用,依據協議,C的標准協義是後面的參數先壓棧,如果換個協義,則可能是換了個壓棧順序了,而VC還有智能優化處理,對於這個a++放前放後都不影響語句結果的,它不動寄存器,被提前處理了也正常,這里也就是先處理b-1表達式,結果壓棧,再處理--b,結果再壓棧,而後調用了printf函數.
我這也有個列子,看看結果,方便理解:
#include <stdio.h>
int main()
{
int a[]={10,20,30,40,50};
int *p=&a[2];
printf("%d,%d,%d,%d,%d,%d,%d\n",*p,*(++p),(*p)++,*p,*p--,--(*p),*p);
printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);
return 0;
}
VC7.1編譯後運行的結果:
29,29,20,29,29,29,29
10,21,29,40,50