欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句

      時間:2019-05-14 16:09:22下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句》。

      第一篇:優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句

      優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句

      1.技術(shù)只是解決問題的選擇,而不是解決問題的根本

      我們可以因為掌握了最新的 JavaScript 框架 ahem、Angular 的 IoC 容器技術(shù)或者某些編程語言甚至操作系統(tǒng)而歡欣雀躍,但是這些東西并不是作為程序員的我們用來解決問題的根本——它們只是用于幫助我們解決問題的簡單工具。

      我們必須非常謹慎,不要對某項正好喜歡或者正好很火的特定技術(shù)走火入魔。否則,我們將進入這樣的思維怪圈:把掌握的那項技術(shù)比做是錘子,在思考問題時,會自然的把所有的問題都想象成是錘子可以解決的釘子。

      2.聰明是代碼清晰的敵人

      當(dāng)編寫代碼時,我們應(yīng)當(dāng)努力做到代碼清晰易理解。雖然這句話并不總是正確的,但在一般情況下,聰明確實是代碼清晰的敵人。

      事實證明,當(dāng)我們寫一段自認為非常了不起的代碼的時候,這些代碼在別人眼里可能會是一頭霧水。

      所以當(dāng)你在編寫某段聰明高效的代碼的時候牢牢記住這個原則是很有必要的。

      如果你對如何編寫整潔清晰的代碼很感興趣的話,我強烈推薦你看羅伯特·C·馬丁的書《The Clean Coder: A Code of Conduct for Professional Programmers》。3.寫盡可能少的代碼

      這句話看起來有一些矛盾。程序員的工作不就是編寫代碼么? 嗯,是的但也不是。

      我們的工作需要我們編寫代碼,但是我們在嘗試解決問題的時候應(yīng)當(dāng)做到盡量編寫更少的代碼。

      這并不意味著我們需要盡量把代碼寫得更緊湊或者把所有的變量都使用單個字母。它的意思是我們應(yīng)當(dāng)嘗試用更精簡的算法來實現(xiàn)所需要實現(xiàn)的功能。

      通常情況下,我們在代碼中所添加的各種很酷的特性是非常誘人的,這還能讓我們的代碼看起來更“健壯”和“靈活”,能夠處理各種不同類型的情況。但是,在更多的時候,我們嘗試更多可能有用的特性或者預(yù)防可能在未來存在的問題的做法是錯誤的。這些額外的代碼可能不具備任何的價值,但是卻可能造成更多的傷害。因為代碼越多,出現(xiàn)未知錯誤的機會就越多,代碼的維護也更加的麻煩。優(yōu)秀的軟件工程師寫盡可能少的代碼。偉大的軟件工程師刪除盡可能多的代碼。4.注釋是代碼表述的最后選擇

      鮑勃·馬丁曾經(jīng)說過:“當(dāng)你在為一段代碼寫注釋的時候,你應(yīng)當(dāng)對自己糟糕的表達能力而反思?!?/p>

      這并不意味著我們以后就不要寫注釋了。但在大多數(shù)情況下這種情況是可以避免的,你可以選擇用更好的命名方式來取代它。

      只有在使用命名都無法表述清楚某個方法或者變量的目的時,注釋才是最后的選擇。事實上,表達無法輕易在代碼表達的東西才是注釋的真正作用。

      舉個例子,注釋可以告訴你在代碼中的那些奇怪的操作命令并不是一個錯誤,而是故意的,那是因為在底層操作系統(tǒng)存在著某個 bug。雖然在一般情況下,許多注釋還是非常有用的,但是卻存在著誤導(dǎo)的風(fēng)險。

      在其它代碼更新后,與某些更新前代碼相關(guān)的注釋常常會得不到同樣的更新,這就導(dǎo)致了某些注釋會變得非常的危險,它們很可能會把你引導(dǎo)到一個錯誤的方向。

      你檢查過與代碼密切相關(guān)的每一段注釋么?是否確保代碼都是在按照注釋所說的那樣做?如果你都照著這樣做了,那么注釋的意義又何在呢?如果你沒有這樣做,你又怎么知道注釋說的都是真的? 所以,注釋的作用并不象所宣揚的那么好,這種東西切勿濫用。5.在編寫代碼之前你應(yīng)當(dāng)清楚你的代碼要做什么 這看起來是理所當(dāng)然的,但實際情況卻不是。

      現(xiàn)實工作中你有多少次是在沒有經(jīng)過充分了解到你的代碼要干些什么就開始著手編程的?反正對于我來說,是不計其數(shù)了,所以我把這條記錄下來用來隨時提醒我。

      測試驅(qū)動開發(fā)(TDD)的實踐在這里可以幫助你,因為你需要在編寫代碼之前了解這些代碼將要用于什么地方,雖然這仍然不能阻止你創(chuàng)建錯誤的東西,但是它仍然非常重要。所以當(dāng)你完完全全了解需要構(gòu)建的需求和功能時,再動手編程。6.提交完成代碼之前先自行測試

      不要在完成編程工作后,就把代碼扔給 QA,然后就坐等消息了。這樣會浪費每一個參加處理不必要 Bug 和問題的人的時間。你應(yīng)當(dāng)在報告編程工作完成之前,花費幾分鐘時間運行測試場景進行自我檢測。當(dāng)然,在你把代碼提交給 QA 之前不一定會發(fā)現(xiàn)每一個 Bug,但至少你可以杜絕一些我們每個人都可能犯下的愚蠢低級錯誤。很多的軟件開發(fā)人員認為測試代碼只是 QA 人員的工作。這是不對的。保持質(zhì)量是我們每個人的責(zé)任。7.每天都要學(xué)一些新東西

      有句名言“刀不磨要生銹,人不學(xué)要落后?!边@句話是很有道理的,因為無論是否獲取到新的知識,你每天都會遺忘掉一些以前的東西。每天學(xué)些一些新東西并不會花費掉你很多的時間。試著每天用 15 分鐘時間去讀書,然后你就會發(fā)現(xiàn)每天你都會有一點點的進步,在未來的某個時候,你會發(fā)現(xiàn)這種進步是巨大的。因此,為了在今后獲得豐厚回報你必須從現(xiàn)在開始就進行投資。另外,今天的技術(shù)發(fā)展日新月異,如果你不改善自己的技巧,學(xué)習(xí)新的東西,你很快就會被甩開。8.寫代碼應(yīng)該成為一種樂趣

      這是非常正確的。或許,你進入這個行業(yè)僅僅是因為它的薪水可觀。選擇一份報酬豐厚的工作這并沒有錯,但是還有更好的選擇,比如醫(yī)生或者律師。事實上很多人選擇做軟件開發(fā)還有一個原因,那就是他們喜歡寫代碼。在你被工作壓力所累的時候,不要忘了你選擇這份職業(yè)的初衷。

      編寫代碼可以帶來很大的樂趣。多年的時間里,很多人可能都已經(jīng)遺忘了這一點,那么從現(xiàn)在起,重新喚回以前的那份熱情吧,從身邊的項目開始,把你的觀念和意識轉(zhuǎn)換到以前你開始學(xué)習(xí)編程的那個時刻。9.你不需要無所不知

      在你學(xué)到了很多知識的時候,你仍然有很多東西不知道。意識到這點很重要,因為它可以驅(qū)使你去了解更多更多的東西。不知道問題的所有答案沒有關(guān)系,不了解某個東西說出來并尋求幫助也無關(guān)緊要。在很多情況下,你可以選擇現(xiàn)學(xué)現(xiàn)用——相信我,我就是這么走過來的。

      我的觀點是,不要企圖去學(xué)習(xí)所有的知識,因為這是一個不可能完成的任務(wù)。你需要關(guān)注和掌握的是能夠幫助你快速學(xué)習(xí)的技巧。10.最佳的實踐視環(huán)境而定

      測試驅(qū)動開發(fā)最好的方法是先編寫測試代碼? 我們應(yīng)該保持結(jié)對編程的習(xí)慣? 如果不使用 IoC 容器是否會低人一等? 所有這些問題的答案是“看情況。”這取決于所處的實際環(huán)境。人們試圖把最佳的實踐通過喉嚨等方式傳輸給你,他們會告訴你,他們平時都是這樣應(yīng)用的。所以,你也應(yīng)該這樣做——這其實并不正確。在寫代碼的時候,我也借鑒過不少別人的成功經(jīng)驗。但是,這些借鑒都是有條件的。

      知識是死的,人是活的。最好的實踐需要視環(huán)境而定。11.努力做到化繁為簡

      所有的的問題都可以進行分解。而最優(yōu)雅的解決方案通常都非常簡單。但是,要變得簡單并不容易,這需要許多的工作。

      比如,這篇文章的目的是從復(fù)雜的軟件開發(fā)工作和日常生活中提取經(jīng)驗,通過歸納,以較簡潔的方式呈現(xiàn)給大家,而這并不是一件容易的事情。

      在解決問題時,可以先找到一個較為復(fù)雜的笨方法。在此基礎(chǔ)上進行努力改進和提煉,使它在正確的基礎(chǔ)上變得簡單。這需要花費很多時間和努力,而人類不正是因為這個過程才慢慢變得聰明么? 【編輯推薦】

      從“拖拽”編程開始到一個合格的程序員

      不要用面向?qū)ο髞砻曰蟪绦騿T新手

      如何成為一名專家級的程序員

      2015年開發(fā)程序員謹防八大心理疾病 程序員人生:如何開始,如何入門,如何前進

      第二篇:[轉(zhuǎn)貼]C語言測試:想成為嵌入式程序員應(yīng)知道的0x10個基本問題

      [轉(zhuǎn)貼]C語言測試:想成為嵌入式程序員應(yīng)知道的0x10個基

      本問題

      C語言測試是招聘嵌入式系統(tǒng)程序員過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為帶面試者和被面試者提供許多有用信息,此外,撇開面試的壓力不談,這種測試也是相當(dāng)有趣的。

      從被面試者的角度來講,你能了解許多關(guān)于出題者或監(jiān)考者的情況。這個測試只是出題者為顯示其對ANSI標準細節(jié)的知識而不是技術(shù)技巧而設(shè)計嗎?這個愚蠢的問題嗎?如要你答出某個字符的ASCII值。這些問題著重考察你的系統(tǒng)調(diào)用和內(nèi)存分配策略方面的能力嗎?這標志著出題者也許花時間在微機上而不上在嵌入式系統(tǒng)上。如果上述任何問題的答案是“是”的話,那么我知道我得認真考慮我是否應(yīng)該去做這份工作。

      從面試者的角度來講,一個測試也許能從多方面揭示應(yīng) 試者的素質(zhì):最基本的,你能了解應(yīng)試者C語言的水平。不管怎么樣,看一下這人如何回答他不會的問題也是滿有趣。應(yīng)試者是以好的直覺做出明智的選擇,還是只是瞎蒙呢?當(dāng)應(yīng)試者在某個問題上卡住時是找借口呢,還是表現(xiàn)出對問題的真正的好奇心,把這看成學(xué)習(xí)的機會呢?我發(fā)現(xiàn)這些信息與他們的測試成績一樣有用。

      從面試者的角度來講,一個測試也許能從多方面揭示應(yīng) 試者的素質(zhì):最基本的,你能了解應(yīng)試者C語言的水平。不管怎么樣,看一下這人如何回答他不會的問題也是滿有趣。應(yīng)試者是以好的直覺做出明智的選擇,還是只是瞎蒙呢?當(dāng)應(yīng)試者在某個問題上卡住時是找借口呢,還是表現(xiàn)出對問題的真正的好奇心,把這看成學(xué)習(xí)的機會呢?我發(fā)現(xiàn)這些信息與他們的測試成績一樣有用。

      有了這些想法,我決定出一些真正針對嵌入式系統(tǒng)的考題,希望這些令人頭痛的考題能給正在找工作的人一點幫住。這些問題都是我這些年實際碰到的。其中有些題很難,但它們應(yīng)該都能給你一點啟迪。

      有了這些想法,我決定出一些真正針對嵌入式系統(tǒng)的考題,希望這些令人頭痛的考題能給正在找工作的人一點幫住。這些問題都是我這些年實際碰到的。其中有些題很難,但它們應(yīng)該都能給你一點啟迪。

      這個測試適于不同水平的應(yīng)試者,大多數(shù)初級水平的應(yīng)試者的成績會很差,經(jīng)驗豐富的程序員應(yīng)該有很好的成績。為了讓你能自己決定某些問題的偏好,每個問題沒有分配分數(shù),如果選擇這些考題為你所用,請自行按你的意思分配分數(shù)。

      從面試者的角度來講,一個測試也許能從多方面揭示應(yīng) 試者的素質(zhì):最基本的,你能了解應(yīng)試者C語言的水平。不管怎么樣,看一下這人如何回答他不會的問題也是滿有趣。應(yīng)試者是以好的直覺做出明智的選擇,還是只是瞎蒙呢?當(dāng)應(yīng)試者在某個問題上卡住時是找借口呢,還是表現(xiàn)出對問題的真正的好奇心,把這看成學(xué)習(xí)的機會呢?我發(fā)現(xiàn)這些信息與他們的測試成績一樣有用。

      從面試者的角度來講,一個測試也許能從多方面揭示應(yīng) 試者的素質(zhì):最基本的,你能了解應(yīng)試者C語言的水平。不管怎么樣,看一下這人如何回答他不會的問題也是滿有趣。應(yīng)試者是以好的直覺做出明智的選擇,還是只是瞎蒙呢?當(dāng)應(yīng)試者在某個問題上卡住時是找借口呢,還是表現(xiàn)出對問題的真正的好奇心,把這看成學(xué)習(xí)的機會呢?我發(fā)現(xiàn)這些信息與他們的測試成績一樣有用。

      有了這些想法,我決定出一些真正針對嵌入式系統(tǒng)的考題,希望這些令人頭痛的考題能給正在找工作的人一點幫住。這些問題都是我這些年實際碰到的。其中有些題很難,但它們應(yīng)該都能給你一點啟迪。

      有了這些想法,我決定出一些真正針對嵌入式系統(tǒng)的考題,希望這些令人頭痛的考題能給正在找工作的人一點幫住。這些問題都是我這些年實際碰到的。其中有些題很難,但它們應(yīng)該都能給你一點啟迪。

      這個測試適于不同水平的應(yīng)試者,大多數(shù)初級水平的應(yīng)試者的成績會很差,經(jīng)驗豐富的程序員應(yīng)該有很好的成績。為了讓你能自己決定某些問題的偏好,每個問題沒有分配分數(shù),如果選擇這些考題為你所用,請自行按你的意思分配分數(shù)。.用預(yù)處理指令#define 聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)#define SECONDS_PER_YEAR(60 * 60 * 24 * 365)UL 我在這想看到幾件事情: 我在這想看到幾件事情:

      #define 語法的基本知識(例如:不能以分號結(jié)束,括號的使用,等等)

      懂得預(yù)處理器將為你計算常數(shù)表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

      意識到這個表達式將使一個16位機的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個常數(shù)是的長整型數(shù)。如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要。.寫一個“標準”宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個。#define MIN(A,B)((A)<=(B)?(A):(B))

      這個測試是為下面的目的而設(shè)的:

      標識#define在宏中應(yīng)用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變?yōu)闃藴蔆的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達到要求的性能,嵌入代碼經(jīng)常是必須的方法。

      三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比if-then-else更優(yōu)化的代碼,了解這個用法是很重要的。

      懂得在宏中小心地把參數(shù)用括號括起來

      我也用這個問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時會發(fā)生什么事?

      least = MIN(*p++, b);3.預(yù)處理器標識#error的目的是什么? 預(yù)處理器標識#error的目的是什么?

      如果你不知道答案,請看參考文獻1。這問題對區(qū)分一個正常的伙計和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當(dāng)然如果你不是在找一個書呆子,那么應(yīng)試者最好希望自己不要知道答案。

      死循環(huán)(Infinite loops)4.嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢?

      嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢?

      這個問題用幾個解決方案。我首選的方案是:

      while(1){ }一些程序員更喜歡如下方案:

      for(;{ }

      這個實現(xiàn)方式讓我為難,因為這個語法沒有確切表達到底怎么回事。如果一個應(yīng)試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:“我被教著這樣做,但從沒有想到過為什么。”這會給我留下一個壞印象。

      第三個方案是用 goto

      Loop:...goto Loop;

      應(yīng)試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進入新領(lǐng)域的BASIC/FORTRAN程序員。5.用變量a給出下面的定義

      a)一個整型數(shù)(An integer)

      b)一個指向整型數(shù)的指針(A pointer to an integer)c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)(A pointer to a pointer to an intege)r d)一個有10個整型數(shù)的數(shù)組(An array of 10 integers)e)一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to integers)

      f)一個指向有10個整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)

      g)一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer)

      h)一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(An array of ten pointers to functions that take an integer argument and return an integer)

      答案是:

      a)int a;// An integer b)int *a;// A pointer to an integer c)int **a;// A pointer to a pointer to an integer d)int a[10];// An array of 10 integers e)int *a[10];// An array of 10 pointers to integers f)int(*a)[10];// A pointer to an array of 10 integers g)int(*a)(int);// A pointer to a function a that takes an integer argument and returns an integer h)int(*a[10])(int);// An array of 10 pointers to functions that take an integer argument and return an integer

      人們經(jīng)常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當(dāng)我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當(dāng)我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間里,我確定我知道這個問題的答案。應(yīng)試者如果不知道所有的答案(或至少大部分答 案),那么也就沒有為這次面試做準備,如果該面試者沒有為這次面試做準備,那么他又能為什么出準備呢?6.關(guān)鍵字static的作用是什么?

      人們經(jīng)常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當(dāng)我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當(dāng)我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間里,我確定我知道這個問題的答案。應(yīng)試者如果不知道所有的答案(或至少大部分答 案),那么也就沒有為這次面試做準備,如果該面試者沒有為這次面試做準備,那么他又能為什么出準備呢?6.關(guān)鍵字static的作用是什么?

      這個簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個明顯的作用:

      這個簡單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個明顯的作用:

      在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。

      在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。

      在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。

      大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應(yīng)試者的嚴重的缺點,因為他顯然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。7.關(guān)鍵字const有什么含意?

      我只要一聽到被面試者說:“const意味著 常數(shù)”,我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)

      如果應(yīng)試者能正確回答這個問題,我將問他一個附加的問題:

      我只要一聽到被面試者說:“const意味著 常數(shù)”,我就知道我正在和一個業(yè)余者打交道。去年Dan Saks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)

      如果應(yīng)試者能正確回答這個問題,我將問他一個附加的問題:

      下面的聲明都是什么意思?

      const int a;int const a;const int *a;int * const a;int const * a const;

      前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意識a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:

      前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意識a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:

      關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)

      關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)

      通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。

      合理地使用關(guān)鍵字const可以使編譯器很自然地保護那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。

      8.關(guān)鍵字volatile有什么含意?并給出三個不同的例子。

      一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:

      一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:

      并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)多線程應(yīng)用中被幾個任務(wù)共享的變量 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)多線程應(yīng)用中被幾個任務(wù)共享的變量回答不出這個問題的人是不會被雇傭的。我認為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。搞嵌入式的家伙們經(jīng)常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。不懂得volatile的內(nèi)容將會帶來災(zāi)難。

      假設(shè)被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。

      一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。一個指針可以是volatile 嗎?解釋為什么。下面的函數(shù)有什么錯誤: int square(volatile int *ptr){ return *ptr * *ptr;}

      下面是答案:

      是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應(yīng)該試圖去修改它。

      是的。盡管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時。

      這段代碼有點變態(tài)。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:int square(volatile int *ptr){ int a,b;a = *ptr;b = *ptr;return a * b;}

      由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

      long square(volatile int *ptr){ int a;a = *ptr;return a * a;}9.嵌入式系統(tǒng)總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設(shè)置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。

      對這個問題有三種基本的反應(yīng)

      不知道如何下手。該被面者從沒做過任何嵌入式系統(tǒng)的工作。

      用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon為其較復(fù)雜的通信芯片寫的驅(qū)動程序,它用到了bit fields因此完全對我無用,因為我的編譯器用其它的方式來實現(xiàn)bit fields的。從道德講:永遠不要讓一個非嵌入式的家伙粘實際硬件的邊。

      用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:#define BIT3(0x1 << 3)static int a;

      void set_bit3(void){ a |= BIT3;} void clear_bit3(void){ a &= ~BIT3;}

      一些人喜歡為設(shè)置和清除值而定義一個掩碼同時定義一些說明常數(shù),這也是可以接受的。我希望看到幾個要點:說明常數(shù)、|=和&=~操作。

      10.嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內(nèi)存位置的特點。在某工程中,要求設(shè)置一絕對地址為0x67a9的整型變量的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務(wù)。

      這一問題測試你是否知道為了訪問一絕對地址把一個整型數(shù)強制轉(zhuǎn)換(typecast)為一指針是合法的。這一問題的實現(xiàn)方式隨著個人風(fēng)格不同而不同。典型的類似代碼如下:

      這一問題測試你是否知道為了訪問一絕對地址把一個整型數(shù)強制轉(zhuǎn)換(typecast)為一指針是合法的。這一問題的實現(xiàn)方式隨著個人風(fēng)格不同而不同。典型的類似代碼如下:int *ptr;ptr =(int *)0x67a9;*ptr = 0xaa55;

      A more obscure approach is: 一個較晦澀的方法是:

      *(int * const)(0x67a9)= 0xaa55;

      即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。11.中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴展—讓標準C支持中斷。具代表事實是,產(chǎn)生了一個新的關(guān)鍵字 __interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個中斷服務(wù)子程序(ISR),請評論一下這段代碼的。__interrupt double compute_area(double radius){ double area = PI * radius * radius;printf(“ Area = %f”, area);return area;}這個函數(shù)有太多的錯誤了,以至讓人不知從何說起了: ISR 不能返回一個值。如果你不懂這個,那么你不會被雇用的。

      ISR 不能傳遞參數(shù)。如果你沒有看到這一點,你被雇用的機會等同第一項。在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。此外,ISR應(yīng)該是短而有效率的,在ISR中做浮點運算是不明智的。

      與第三點一脈相承,printf()經(jīng)常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點,那么你的被雇用前景越來越光明了。12.下面的代碼輸出是什么,為什么?void foo(void){ unsigned int a = 6;int b =-20;(a+b > 6)? puts(“> 6”): puts(“<= 6”);}

      這個問題測試你是否懂得C語言中的整數(shù)自動轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 ”>6”。原因是當(dāng)表達式中存在有符號類型和無符號類型時所有的操作數(shù)都自動轉(zhuǎn)換為無符號類型。因此-20變成了一個非常大的正整數(shù),所以該表達式 計算出的結(jié)果大于6。這一點對于應(yīng)當(dāng)頻繁用到無符號數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。

      13.評價下面的代碼片斷:

      評價下面的代碼片斷:unsigned int zero = 0;unsigned int compzero = 0xFFFF;/*1's complement of zero */

      對于一個int型不是16位的處理器為說,上面的代碼是不正確的。應(yīng)編寫如下:

      unsigned int compzero = ~0;

      這一問題真正能揭露出應(yīng)試者是否懂得處理器字長的重要性。在我的經(jīng)驗里,好的嵌入式程序員非常準確地明白硬件的細節(jié)和它的局限,然而PC機程序往往把硬件作為一個無法避免的煩惱。

      到了這個階段,應(yīng)試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應(yīng)試者不是很好,那么這個測試就在這里結(jié)束了。但如果顯然應(yīng)試者做得不錯,那么我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優(yōu)秀的應(yīng)試者能做得不錯。提出這些問題,我希望更多看到應(yīng)試者應(yīng)付問題的方法,而不是答案。不管如 何,你就當(dāng)是這個娛樂吧…

      14.盡管不像非嵌入式計算機那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動態(tài)分配內(nèi)存的過程的。那么嵌入式系統(tǒng)中,動態(tài)分配內(nèi)存可能發(fā)生的問題是什么?

      盡管不像非嵌入式計算機那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動態(tài)分配內(nèi)存的過程的。那么嵌入式系統(tǒng)中,動態(tài)分配內(nèi)存可能發(fā)生的問題是什么?

      這里,我期望應(yīng)試者能提到內(nèi)存碎片,碎片收集的問題,變量的持行時間等等。這個主題已經(jīng)在ESP雜志中被廣泛地討論過了(主要是 P.J.Plauger, 他的解釋遠遠超過我這里能提到的任何解釋),所有回過頭看一下這些雜志吧!讓應(yīng)試者進入一種虛假的安全感覺后,我拿出這么一個小節(jié)目: 下面的代碼片段的輸出是什么,為什么?

      char *ptr;if((ptr =(char *)malloc(0))== NULL)else puts(“Got a null pointer”);puts(“Got a valid pointer”);

      這是一個有趣的問題。最近在我的一個同事不經(jīng)意把0值傳給了函數(shù)malloc,得到了一個合法的指針之后,我才想到這個問題。這就是上面的代碼,該代碼的輸出是“Got a valid pointer”。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。15 Typedef 在C語言中頻繁用以聲明一個已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子:#define dPS struct s * typedef struct s * tPS;

      以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結(jié)構(gòu)s指針。哪種方法更好呢?(如果有的話)為什么?

      這是一個非常微妙的問題,任何人答對這個問題(正當(dāng)?shù)脑颍┦菓?yīng)當(dāng)被恭喜的。答案是:typedef更好。思考下面的例子:

      dPS p1,p2;tPS p3,p4;

      第一個擴展為

      struct s * p1, p2;上面的代碼定義p1為一個指向結(jié)構(gòu)的指,p2為一個實際的結(jié)構(gòu),這也許不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。

      晦澀的語法16.C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?int a = 5, b = 7, c;c = a+++b;

      這個問題將做為這個測驗的一個愉快的結(jié)尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成:

      c = a++ + b;

      因此, 這段代碼持行后a = 6, b = 7, c = 12。

      如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當(dāng)作問題。我發(fā)現(xiàn)這個問題的最大好處是這是一個關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題。

      如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當(dāng)作問題。我發(fā)現(xiàn)這個問題的最大好處是這是一個關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題。

      好了,伙計們,你現(xiàn)在已經(jīng)做完所有的測試了。這就是我出的C語言測試題,我懷著愉快的心情寫完它,希望你以同樣的心情讀完它。如果是認為這是一個好的測試,那么盡量都用到你的找工作的過程中去吧。天知道也許過個一兩年,我就不做現(xiàn)在的工作,也需要找一個。

      好了,伙計們,你現(xiàn)在已經(jīng)做完所有的測試了。這就是我出的C語言測試題,我懷著愉快的心情寫完它,希望你以同樣的心情讀完它。如果是認為這是一個好的測試,那么盡量都用到你的找工作的過程中去吧。天知道也許過個一兩年,我就不做現(xiàn)在的工作,也需要找一個。

      Nigel Jones 是一個顧問,現(xiàn)在住在Maryland,當(dāng)他不在水下時,你能在多個范圍的嵌入項目中找到他。他很高興能收到讀者的來信,他的email地址是: NAJones@compuserve.com。References:

      是一個顧問,現(xiàn)在住在Maryland,當(dāng)他不在水下時,你能在多個范圍的嵌入項目中找到他。他很高興能收到讀者的來信,他的email地址是: NAJones@compuserve.com。References:

      Jones, Nigel, “In Praise of the #error directive,” Embedded Systems Programming, September 1999, p.114.Jones, Nigel, “ Efficient C Code for Eight-bit MCUs ,” Embedded Systems Programming, November 1998, p.66.

      第三篇:smarty程序員應(yīng)該知道的37個變量

      變量

      1、SMARTY_DIR Smarty目錄

      定位Smarty類文件的完整系統(tǒng)路徑,如果沒有定義Smarty目錄,Smarty將會試著自動創(chuàng)建合適的值。如果定義了,路徑必須要以斜線結(jié)束。define(“SMARTY_DIR”,“/usr/local/lib/php/Smarty/”);require_once(SMARTY_DIR.“Smarty.class.php”);

      2、$template_dir 模板目錄變量

      該變量定義默認模板目錄的名字。當(dāng)包含文件時,如果不提供一個源類型(即源地址),那么將會到模板目錄中尋找。默認情況下,目錄是:“./templates”,也就是說他將會在和php執(zhí)行腳本相同的目錄下尋找模板目錄。

      3、$compile_dir 編譯目錄變量

      該變量定位編譯模板的目錄名字。默認情況下,目錄是:“./templates_c”,也就是說他將會在和php執(zhí)行腳本相同的目錄下尋找編譯目錄。

      4、$config_dir 配置目錄變量

      該變量定義用于存放模板配置文件的目錄,默認情況下,目錄是:“./configs”,也就是說他將會在和php執(zhí)行腳本相同的目錄下尋找配置目錄。

      5、$plugins_dir 插件目錄變量

      該變量定義Smarty尋找所需插件的目錄。默認是在SMARTY目錄下的“plugins”目錄。如果提供了一個相對路徑,Smarty將首先在SMARTY目錄下尋找,然后到當(dāng)前工作目錄下尋找,繼而到php包含路徑中的每個路徑中尋找。

      6、$debugging 調(diào)試變量

      它能啟動調(diào)試控制臺。該控制臺是一個javascript窗口,該窗口告訴你被包含的模板和應(yīng)用于當(dāng)前模板頁面的變量。

      7、$debug_tpl 調(diào)試模板

      該變量定義用于調(diào)試控制臺的模板文件名字。默認情況下,其名字為:debug.tpl,位于Smarty目錄中。

      8、$debugging_ctrl 調(diào)試控制變量

      該變量作用是允許以交替的方式啟動調(diào)試設(shè)置。NONE表示不允許交替方式。URL表示當(dāng)關(guān)鍵詞SMARTY_DEBUG出現(xiàn)在QUERY_STRING(查詢字符串)中時,針對此腳本的調(diào)用,調(diào)試被啟動。如果$debugging變量是真,則忽略其調(diào)試控制變量值。

      9、$global_assign全局配置變量

      定義一組總是隱式地作用于模板引擎的變量列表。這對于使全局變量或服務(wù)器變量可用于所有模板是很方便的,因為無需手工配置它們。在全局配置中的每一元素應(yīng) 當(dāng)要么是一全局變量的名字,要么是一鍵/值對(鍵是全局數(shù)組名,值是對應(yīng)該全局數(shù)組的變量數(shù)組)。$SCRIPT_NAME變量默認屬于$HTTP_SERVER_VARS數(shù)組。

      10、$undefined未定義變量

      該變量為Smarty設(shè)定沒有得到定義的變量的值,默認為空.當(dāng)前僅用來設(shè)定全局配置中的未定義變量為一個默認值.11、$autoload_filters自動加載過濾器變量

      如果你希望在每次模板調(diào)用過程中加載過濾器,你可以指定他們使用此變量,Smarty將自動為你加載它們.該變量是一個聯(lián)合數(shù)組,在數(shù)組中鍵是過濾器類型,值是過濾器名字所組成的數(shù)組.例如: $smarty->autoload_filters = array('pre' => array('trim', 'stamp'), 'output' => array('convert'));

      12、$compile_check編譯檢查變量

      每次調(diào)用PHP應(yīng)用程序,Smarty 會試著查看自上次編譯時間以來,當(dāng)前模板是否被修改過.如果修改過了,她會重新編譯那個模板.如果模板還沒有被編譯過,她將編譯模板而不管編譯檢查如何設(shè) 置.默認情況下編譯檢查這個變量設(shè)置為true.一旦一個應(yīng)用程序投入產(chǎn)品中(模板將不會修改了),就不再需要編譯檢查這一步了.為了最大性能,確定 將$compile_check設(shè)為“false”.注意:如果設(shè)為了“false”,雖然模板文件被修改,但你不會看到修改結(jié)果,因為模板沒有得到重新 編譯.如果啟動了緩存和編譯檢查,一旦有關(guān)模板文件或配置文件被更新,緩存文件將會重建.13、$force_compile強迫編譯變量

      強迫Smarty每次調(diào)用(重新)編譯模板時.這項設(shè)置不受$compile_check的限制.默認情況下,它是無效的.它對于開發(fā)和調(diào)試很方便.但它決不能使用于產(chǎn)品環(huán)境下.如果啟動了緩存,每次將會重新生成緩存文件.14、$caching緩存變量 告訴Smarty是否緩存模板的輸出.默認情況下,她設(shè)為0,或無效.如果模板產(chǎn)生冗余內(nèi)容,建議打開緩存.這樣有利于獲得良好的性能增益.你也可以為同一模板設(shè)有多個緩存.當(dāng)值為1或2時啟動緩存.1告訴Smarty 使用當(dāng)前的$cache_lifetime變量判斷緩存是否過期.2告訴 Smarty 使用生成緩存時的cache_lifetime值.用這種方式你正好可以在獲取模板之前設(shè)置緩存生存時間,以便較精確地控制緩存何時失效.如果啟動了編譯檢查,一旦任何的模板文件或配置文件(有關(guān)緩存部分的配置文件)被修改,緩存的內(nèi)容將會重新生成.如果啟動了強迫編譯,緩存的內(nèi)容將總會重新生成.15、$cache_dir緩存目錄變量

      這是存放模板緩存的目錄名.默認情況下,它是:“./cache”,也就是說你可以在和php執(zhí)行腳本相同目錄下尋找緩存目錄.你也可以用你自己的自定義緩存處理函數(shù)來控制緩存文件,它將會忽略這項設(shè)置.16、$cache_lifetime緩存生存時間變量

      該變量定義模板緩存有效時間段的長度(單位秒),一旦這個時間失效,則緩存將會重新生成.如果要想實現(xiàn)所有效果,$caching必須 因$cache_lifetime需要而設(shè)為“true”.值為-1時,將強迫緩存永不過期.0值將導(dǎo)致緩存總是重新生成(僅有利于測試,一個更有效的使 緩存無效的方法是設(shè)置$caching = false.)如果啟動了強迫編譯,則緩存文件每次將會重新生成.要想有效地停止緩存,你可以利用clear_all_cache()函數(shù)清除所有的緩存文件,或者利用clear_cache()函數(shù)清除個別文件(或文件組).17、$cache_handler_func緩存處理函數(shù)變量

      你可以提供一個自定義函數(shù)來處理緩存文件,而不是通過變量$cache_dir使用內(nèi)置方法.祥見:cache handler function section

      18、$cache_modified_check緩存修改檢查變量

      如果設(shè)置該變量為真,Smarty將分析客戶端發(fā)送來的If-Modified-Since頭信息.如果緩存文件時間戳自上次訪問以來沒有改變,則發(fā)送一個“304 Not Modified”頭,而不是緩存文件內(nèi)容.這種方式僅工作于沒有 {insert} 標記的緩存內(nèi)容.19、$config_overwrite配置覆蓋變量

      如果設(shè)該變量為真,則從配置文件中讀取出來的變量將會互相覆蓋.否則,變量將會放到一個數(shù)組中.如果你想把配置文件中的數(shù)據(jù)存儲到數(shù)組里,這種方式是很有用的,僅僅列出每個元素多次就可以了.默認情況下,設(shè)為真.20、$config_booleanize配置布爾化變量

      如果該變量設(shè)為真,配置文件中的on/true/yes 和 off/false/no值會自動轉(zhuǎn)化為布爾值.這樣的話,你就可以在模板中像{if #foobar#}pp815 {/if}這樣使用這些值了.如果foobar為on, true 或 yes,那么 {if}語句就會執(zhí)行了.默認情況下,該變量值為真.21、$config_read_hidden配置讀取隱藏變量

      如果設(shè)為真,在配置文件中的隱藏節(jié)塊(******不會翻譯啦)可以從模版中讀取出來.典型的你會設(shè)為假,這樣你可以在配置文件里存放敏感數(shù)據(jù),例如數(shù)據(jù)庫參數(shù),而不用擔(dān)心模版會調(diào)用他們.默認情況下,該變量設(shè)為假.22、$config_fix_newlines配置固定換行符變量

      如果該變量設(shè)為真,那么在配置文件中的mac 和 dos 換行符(r and rn)在語法解析時將會轉(zhuǎn)換為n.默認情況下,該變量為真.23、$default_template_handler_func默認模板處理函數(shù)變量

      該函數(shù)在模板不能從它的源目錄下獲取時會得到調(diào)用.24、$php_handling php處理變量

      該變量告訴Smarty怎樣處理嵌入到模版中的php代碼.有四種可能的設(shè)置,默認為SMARTY_PHP_PASSTHRU.注意:改變量的設(shè)置不會影響模板里面{php}{/php}標記中的php代碼.原樣輸出標記.作為html實體引用標記 從模板中移出標記.將作為php代碼執(zhí)行標記.極度不贊成將php代碼嵌入到模板中.25、$security安全變量

      安全變量要么是真,要么是假.默認為假.當(dāng)你不信任模板中的可編輯部分(例如通過ftp方式上傳編輯的), 并想通過模板語言減小系統(tǒng)非安全的風(fēng)險時,安全變量設(shè)為真比較適合.設(shè)為真會將下面的規(guī)則強加于模板語言中,除非特別地 用$security_settings覆蓋.? ? ? ? ? ? 如果變量$php_handling設(shè)為了SMARTY_PHP_ALLOW,則會隱式地被修改成SMARTY_PHP_PASSTHRU PHP函數(shù)在IF語句中是不允許的,除了在$security_settings中另行指出.模板僅可以包含于$secure_dir數(shù)組列出的目錄中.本地文件僅可以用{fetch}獲取于$secure_dir數(shù)組列出的目錄中.{php}{/php} tags are not allowed 不允許有{php}{/php}標記.PHP函數(shù)不允許作為修正器,除了在$security_settings中指出.26、$secure_dir安全目錄變量

      這是一個與安全有關(guān)的本地目錄數(shù)組變量.當(dāng)啟動安全變量時{include} 和 {fetch}會用到此數(shù)組變量.27、$security_settings安全配置變量

      These are used to override or specify the security settings when security is enabled.These are the possible settings: 用于當(dāng)啟動安全變量時覆蓋或另行指定安全配置.有以下幾種可能的配置: ? ? ? ? ? PHP_HANDLING這是一個可允許包含在if語句中的php函數(shù)名數(shù)組.INCLUDE_ANY真或假.如果真,{php}{/php}允許在模板中存在.MODIFIER_FUNCS-這是一個可用作修正器的php函數(shù)名數(shù)組.28、$trusted_dir信任目錄變量

      信任目錄變量僅用在$security啟動之后.這是一個所有建立信任的目錄數(shù)組變量.你可以將php腳本放到這些信任目錄中,這些腳本會直接在模板里以{include_php}標記得到執(zhí)行.29、$left_delimiter左結(jié)束符變量

      用于模板語言中,默認是“{”.30、$right_delimiter右結(jié)束符變量

      用于模板語言中,默認是“}”.31、$compiler_class編譯類變量

      指定Smarty用來編譯模板的編譯類名.默認為:'Smarty_Compiler'.僅適合于高級用戶.32、$request_vars_order變量順序變量

      請求變量的順序在這里配置,類似于php.ini中的變量順序.33、$request_use_auto_globals自動全局變量

      指定Smarty是否使用php的$HTTP_*_VARS[]數(shù)組變量(默認$request_use_auto_globals=false)或$_*[]數(shù)組($request_use_auto_globals=true)變量.這對使用了{$smarty.request.*}, {$smarty.get.*}等標記的模板有影響.值得注意的是:如果設(shè)置$request_use_auto_globals為真,variable.request.vars.order就無效了但php的gpc_order配置值還有作用.34、$compile_id編譯id變量

      永久的編譯鑒別號.作為一個可選辦法將相同的編譯號傳遞給每個函數(shù)調(diào)用,你可以設(shè)置這個編譯id,隨后此id將會被隱含地使用.35、$use_sub_dirs子目錄變量

      如果你的php環(huán)境不允許Smarty創(chuàng)建子目錄,則設(shè)此變量為假.子目錄非常有用,所以盡可能的使用他們.36、$default_modifiers默認修正器變量

      這是一個修正器數(shù)組變量,這些修正器隱式地作用于模板中的每個變量.例如:針對HTML,用數(shù)組('escape:“htmlall”')默認地忽略每個 變量;為了使一個變量免除于默認修正器,請將參數(shù)為“nodefaults”的特殊“smarty”修正器作用于它,例如: {$var|smarty:nodefaults}.37、$default_resource_type默認源類型變量

      該變量告訴smarty隱式地使用什么源類型.默認值為'file',也就是說,$smarty->display('pp815/index.tpl');和and $smarty->display('file:index.tpl');從意思上是一樣的.

      第四篇:CakePHP程序員必須知道的21條技巧

      這篇文章可以說是CakePHP教程中最經(jīng)典的了。雖然不是完整的手把手系列,但作者將自己使用CakePHP的經(jīng)驗總結(jié)了21條,這些尤其是對新手十分有用。

      翻譯時故意保留了一些CakePHP中特有的詞語沒有翻譯,如controller、model等。相信學(xué)過CakePHP的人應(yīng)該馬上就能理解它們的意思吧。

      另外,CakePHP的wiki已經(jīng)失效,取而代之的是一個名為bakery的網(wǎng)站。原文中引用的wiki的鏈接也都已更新到了bakery上。

      快速創(chuàng)建靜態(tài)頁面

      我想建立幾個頁面,它們僅包含靜態(tài)數(shù)據(jù),使用默認layout,不需要任何model。最初我試圖創(chuàng)建一個controller并為每個靜態(tài)頁面定義一個action。但這種方法很笨拙,也不適合快速創(chuàng)建靜態(tài)頁面。

      實際上只要使用pages controller就可以做到——只要在 views/pages 文件夾下創(chuàng)建一個 view,就可以通過 /pages 來訪問。例如,我創(chuàng)建了 /views/pages/matt.thtml,就可以通過 http://

      我需要修改調(diào)用$html->selectTag()時生成的,使其生成“請選擇”選項來代替默認的空白選項。我也希望單選按鈕能帶有標簽,這樣用戶就無需精確地點擊單選按鈕本身,而只需單擊到關(guān)聯(lián)的文字上即可。

      建立 /app/config/tags.ini.php,然后添加以下的內(nèi)容:

      ;Tag template for a input type='radio' tag.radio = “%s”

      ;Tag template for an empty select option tag.selectempty = “--Please Select--”

      你可以從/cake/config/tags.ini.php中獲得完整的標簽列表。但我不建議修改該文件,否則升級CakePHP時可能會讓你的修改丟失。

      自定義404頁面

      如果你需要自定義404頁面,只需創(chuàng)建 /app/views/errors/error404.thtml。

      第五篇:新手程序員應(yīng)該知道的7件事

      ?以下是資深軟件開發(fā)人員分享的一些關(guān)于專業(yè)化編程的經(jīng)驗和教訓(xùn),這些經(jīng)驗教訓(xùn)都是經(jīng)過多年歷練總結(jié)得出的。

      如果你剛進入專業(yè)的軟件開發(fā)世界,那么得益于在計算機科學(xué)和編程方面的教育和/或培訓(xùn),你已經(jīng)具備了一定的知識。但是真正的開發(fā)業(yè)務(wù)工作又和在學(xué)校編程不同,這是你不可能從大學(xué)課程或編碼學(xué)校中學(xué)會的東西。

      ?為了了解新手程序員需要知道哪些內(nèi)容,我咨詢了一些經(jīng)驗豐富的編碼老將,這些“老”將全部有著至少十年(有的甚至是幾十年)作為專業(yè)軟件工程師的工作經(jīng)驗。我的問題是,如果他們現(xiàn)在回過頭去,哪些技能和知識是他們第一次以寫代碼為生的時候就希望能夠掌握的。無論你是一個剛畢業(yè)剛開始自己第一份開發(fā)工作的大學(xué)生,還是年長的轉(zhuǎn)業(yè)到編程領(lǐng)域的工作者,歡迎閱讀這7條專為新手程序員總結(jié)的建議。

      1.了解底層系統(tǒng)

      軟件開發(fā)的一個重要組成部分是,了解編程語言。但是,正如有些人建議的那樣,開發(fā)人員還需要了解堆棧下面是怎么回事。

      “很多語言抽象化了系統(tǒng)層正在發(fā)生的事情,這種抽象是很有用的因為它讓開發(fā)人員在大多數(shù)時間里變得更高效?!盤eteBul,Acquia公司的一位支持工程師說?!暗?,當(dāng)你碰到一個障礙,一個特別堅實的bug,需要更深層次地了解內(nèi)部究竟發(fā)生了什么的時候,那么了解底層系統(tǒng)就是一個很有用的技能,可以讓你調(diào)試進程,查看系統(tǒng)調(diào)用,并且真正意義上看到代碼片段與系統(tǒng)的其余部分的交互,”他在郵件中這樣寫道。

      無獨有偶,RobertDouglass,CustomerSatisfactionwithPlatform.sh的副總裁告訴我,“當(dāng)我剛開始編程的時候,對于計算機我有很多不明白的地方。文件系統(tǒng),網(wǎng)絡(luò)連接以及內(nèi)存機制就是三個明顯的例子。不了解這些,意味著我可能會不知道一些我想要呈現(xiàn)的編程結(jié)構(gòu)的目標?!?/p>

      2.知道命令行工具

      作為一個開發(fā)人員,你必然需要將大量的時間花在IDE或代碼編輯器上。但是,知道命令行這個工具有助于你更便捷地完成工作。

      “有時候,你可能會處在一種需要緊急完成任務(wù)但工具卻非常有限的情境中?!币晃灰延?0年工作經(jīng)驗,并希望能夠匿名的資深程序員告訴我,“知道shell就要像呼吸一樣自然。掌握類似于find、comm、diff、vi/vim、sed、awk等工具。知道如何用命令行來查找文件等等,都可以在你寫腳本的時候為你減負?!?/p>

      Bull,是一位先用微軟工具,然后逐漸轉(zhuǎn)移到Linux的程序員,對此表示贊同:“了解命令行的來龍去脈以及掌握所有的實用程序真的很重要。這是我經(jīng)歷過的切身體會?!?/p>

      3.調(diào)試器是我們的好朋友

      程序員很大一部分時間會涉及追蹤bug。Dave Varon,Novartis公司的一位生物信息學(xué)開發(fā)人員,著重強調(diào)了調(diào)試器的優(yōu)點以及它是如何減輕了時間的初始成本?!耙欢ㄒ莆杖绾问褂谜{(diào)試器!”他告訴我,“磨刀不誤砍柴工,事先不妨花個一兩天時間進行配置。如果沒有得到預(yù)期結(jié)果,那就調(diào)試:設(shè)置斷點,逐步調(diào)試代碼,特別要注意第三方代碼。這可以避免很多挫折,也能讓你更好地了解那些只能通過閱讀別人的代碼才能知道的編碼知識。”

      4.學(xué)習(xí)編寫測試

      一些開發(fā)人員認為,單元測試,也就是編寫測試來驗證小單位代碼是否在做應(yīng)該做的事情,是非常關(guān)鍵的。RichardHandloff,StrategicPowerSystems的數(shù)據(jù)庫開發(fā)人員,就是其中之一?!拔艺J為我曾給那些想要學(xué)習(xí)編程的人提的最佳建議就是,要學(xué)習(xí)編寫良好的測試并且學(xué)習(xí)在進程早期就開始編寫測試,”他在回信給我的郵件中這樣寫道。

      5.積極應(yīng)對變化和學(xué)習(xí)新系統(tǒng)

      大家都知道,現(xiàn)在的技術(shù)變化很快。這不僅適用于深受我們喜愛的消費品,對于程序員使用的底層系統(tǒng)、語言和工具同樣如此。

      AdamWulf,MilestoneMade公司的移動開發(fā)者和創(chuàng)始人建議,要積極應(yīng)對變化,并始終保持在技術(shù)的前沿?!艾F(xiàn)在,我的建議是每隔4年就得計劃去學(xué)習(xí)基本上全新的技術(shù)堆棧,”

      “好的基礎(chǔ)知識永遠是可用的,但是你每天要用的工具和技術(shù)差不多每隔4年就會完全不同。”

      “項目永遠不可能只用一種語言和一種框架,”一位不愿意透露姓名的開發(fā)人員說,“你不能吊死在一種技術(shù)上,要習(xí)慣于從一個項目到另一個項目的轉(zhuǎn)移,一種語言/技術(shù)到另一種語言/技術(shù)的擴散,”他寫道。

      6.良好的合作

      Varon重申了人際交往能力的重要性,他說:“如果你通過再次查閱API和調(diào)試,依然不能弄清楚問題的根源,那就應(yīng)該尋求幫助。哪怕你覺得你寫的是杰作,也并不意味著沒有廢話或者不能更好。要和同事融洽相處。有時候只需要大聲地說出這個問題或許就會有靈光一現(xiàn)?!?/p>

      一些匿名人士還分享了類似的想法,比如說成為團隊成員。“提升團隊凝聚力,樂于助人,即使是一些瑣碎的工作,”他說。但是,在這種情況下,他警告說,“一定要有一個度,不要撿了芝麻丟了西瓜,忘記了自己的本職工作?!?/p>

      7.不要害怕失業(yè)

      Miller有一個特別有趣的忠告?!疤劬褪菚x升,”他告訴我?!皩ふ医鉀Q問題最簡單的方法,可以讓你的代碼彈性化和免于維護,這樣你的上司就會交給你更多的事情。他們甚至?xí)竽銓⒛愕淖龇ń淌诮o別人,“他解釋說?!翱偠灾晃兜負?dān)心失業(yè)可能會阻礙職業(yè)生涯的前進?!?/p>

      下載優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句word格式文檔
      下載優(yōu)秀的程序員都應(yīng)當(dāng)知道的11個警句.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        50個程序員必須知道的網(wǎng)站[5篇范文]

        50個程序員必須知道的網(wǎng)站1 csdn 2 Vc知識庫 17 游戲開發(fā)資源網(wǎng) 31 開源力量 http://prg.com.cn/ 33 中國電子網(wǎng) http://21ic.com/ 34 編程中國 http:///bbs/ 36 電腦愛好......

        java程序員必須知道的八大排序

        Java程序員必知的8大排序 2012-06-28 14:01 without0815 博客園 我要評論(0) 字號:T | T 本文主要詳解了Java語言的8大排序的基本思想以及實例解讀,詳細請看下文 AD: 51CTO云計......

        有個秘密你可知道讀后感

        你善良嗎?只有內(nèi)心善良純粹的人才能看到傘靈。這是陶茜媽媽說的話,可是,真的是這樣嗎?這個善意的謊言被陶茜一點點地撕破,只因那個男孩的出現(xiàn)。男孩可以說是陶茜的哥哥,但是,男孩卻......

        C總結(jié)_7(嵌入式程序員應(yīng)知道基本問題)

        C總結(jié)_7(嵌入式程序員應(yīng)知道的基本問題) ------------------------- C語言測試是招聘嵌入式系統(tǒng)程序員過程中必須而且有效的方法。 這些年,我既參加也組織了許多這種測試,......

        有理想的程序員必須知道的15件事

        有理想的程序員必須知道的15件事 ugmbbc發(fā)布于 2011-04-20 15:13:01|9708 次閱讀 字體:大 小 打印預(yù)覽 感謝聊IT評論網(wǎng)的投遞 作為程序員,要取得非凡成就需要記住的15件事。 1......

        程序員應(yīng)知道的IT界的9個學(xué)習(xí)計劃

        程序員應(yīng)知道的IT界的9個學(xué)習(xí)計劃 制定計劃是我們最喜歡做的事情之一,我們總是會在年底的時候?qū)π碌囊荒暧幸粋€很好的計劃,但后來就把它們都拋到腦后了,直到最后全部忘記。也許......

        程序員從編程總結(jié)的 22 個經(jīng)驗

        以下所列是我在這些年來軟件開發(fā)工作過程中受到的啟發(fā),還有總結(jié)而來的好經(jīng)驗。 開發(fā) 1. 從小事做起,然后再擴展 無論是創(chuàng)建一個新的系統(tǒng),還是在現(xiàn)有的系統(tǒng)中添加新的功能......

        很有意思的警句——摘自瘋狂的程序員(大全5篇)

        1 Hello World 1 要說念大學(xué),最忌諱的就是在自己家門口念。哪怕你家住北大院子里,也一定要去別的學(xué)校念。 2 DOS 4 “DOS”就是“Disk Operating System”,磁盤操作系統(tǒng)?!癟M......