目前分類:未分類文章 (967)

瀏覽方式: 標題列表 簡短摘要

策米安語翻譯列位前輩好 據小弟所知 美國碩士若是要申請fall入學 大概前一歲尾就要送資料了 最慢三四月也要送 最慢最慢彷佛聽說有到六月的 但一般來講拼的就是托福成就 還有GRE或是GMAT 小弟本想照如許拼 然後本年底申請 明年秋季入學 但家裡卻說希望能早點送天成翻譯公司出去 托福不到沒關係(今朝托福約80) 先唸語言 再申請碩士 (據說這樣也比力好申請上) 爬過一些文 今朝方針是USC或UC系列 想請問大大若是要去這些處所 先讀說話再轉碩士班 時間軸大概怎麼抓 (我是希望能遇上2019fall之前進入正式碩士課程) 還有我需要申請語言黉舍之前 就得先決議好以後要申請的科系嗎 (SOP翻譯社保舉信啥時要丟?) p.s. 進展有過來人能幫手解答 知道本身程度不是很好 托福是很難考到90/100的 也沒有太時興的GPA跟履歷 又傳聞說話學校會比較好轉進去 有留學名校的夢 家裡也願意支持 今朝在爸爸店裡協助 以後會去打工換宿一個月 要出去唸說話的話 大概暑假事後就能夠動身

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

英翻波蘭文

【Siku林瑋茜/Tjivuluwan孫政賢 台北市-新北市】 2018-03-17 (民進黨立法委員 葉宜津: 第一個要做的就是,丟掉ㄅㄆㄇㄈ,ㄅㄆㄇㄈ有什麼用。) 日前立委葉宜津在參選台南市長的政見頒發時,主張「廢除ㄅㄆㄇ,改學羅馬拼音」,要讓語言進修更便當,也藉此和國際接軌。而族語書寫系統統一利用羅馬拼音,拔除ㄅㄆㄇ後,只有單一標音系統,是不是對於族語進修有輔助?第一線說話教師各有看法,有教師認為,羅馬拼音跟注音符號都是從傳聞到讀寫中央的過渡階段,就算廢注音符號,還是難以去保持說話,換句話說,就是要有必然的傳聞根蒂根基,再去學標音系統才有用翻譯 (聲音來源:台灣原語學會理事長puljaljuyan‧kalevuwan(波宏明) 排灣族: 併存並沒有什麼不當,你用羅馬拼音,來拼我們的中文華語,那是不難的工作,然後又可以,使用我們的族語,所以這是對我們族語的成長,絕對是有協助啦。) (族語教師 Upah Yuki(烏巴赫 尤紀) 泰雅族: 我們低年級,盡量是不要讓他一起頭就讓他進修這些24個字母羅馬拼音,如許對小朋友,我是感覺他們,對他們沒有什麼輔助的,因為我們在每次教他們的時刻,希望就是在他腦海裏面,都有這個聲音的記憶翻譯) (語文教師 唐南蘋: 廢了注音符號,是不是能匡助語言?只能幫忙書面上他對照熟習那個文字,可是事實上文字對應到哪一個音,照樣要有聽語的情況,天成翻譯公司們此刻的聽語情況是比力不足的。) 有教育工作者示意,廢不廢除的議題,治標不治本,族語進修重點在於營造聽語環境,而注音符號這套標音系統的價值是在漢字本位,能初學漢字筆畫或筆順;羅馬拼音則是拉丁字母本位的標音系統,是以就比力上,沒有誰好誰壞,而是各有所長。 (新北市丹鳳國小校長 高淑真 邵族: 假設孩子會羅馬拼音,固然對他剛入手下手進修說話早期入門會有幫助,但僅止於初期,每個國度的說話都有他的文化層面,跟地區構成性,那天成翻譯公司們的漢字跟注音符號,他有他如許的文化脈絡。) 許多語文教師也強調,語文能力是仰賴教育普及水平和教授教養方式,按部就班培育起來,並非特定一種文字或符號的系統就具有絕對優勢,是以如許的政見是不是行得通,生怕需要多方妥善思考。 [原民台新聞影音報道]

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

學術論文翻譯

問題是,許多人的文法常識都是一團糊…

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

福爾富德文翻譯

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

履歷翻譯

 

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

中翻英

 

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

利西亞文翻譯

在劇中扮演反派丁雅的張穎穎,暗裏里倒是個單純活躍的女孩子。即便和Tina她們說話不通卻仍然嘻嘻哈哈的,溝通全靠比劃和傻笑翻譯兩小我聊天也經常使用中文,Tina還譏諷穎穎像小豬,永久在吃工具。休息的時候,Tina還會和各人打手游,恰似一個“網癮少女”。

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

電子翻譯推薦

在台北新光三越南西店設櫃的塩屋,本店就在石垣島,臨近730記念碑,除沖繩本地及來自世界各地的鹽,也研發出多種口胃的調味鹽,悉數可試吃,大抵來說口胃較濃烈,少許就有鹹味,買小瓶就可以用很久;店裡還有冰淇淋、調養品、零食等相幹商品,創意實足。

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

口譯費用

思婦在漫漫無期的期待中,有一天,她突然聽到響亮的達達馬蹄聲由遠而近,那必是本身忖量的人騎馬歸來,她的心被達達的馬蹄激活了,懷著滿腔的欣喜,打開久久緊掩的窗扉,迎接歸人抵家,可看到的是一個生疏過客,從窗前走過,這和“妝樓颙望,誤幾回、天際識歸舟”何其相似,又是一個多麼讓人心傷的故事啊。《錯誤》確是一首細膩典雅充滿哀怨的詩歌翻譯

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

依博文翻譯

不外好好的學生,為何會面臨延畢的悲涼命運?又是因為他們做了哪些事,致使他們必需承當沒法準時順利結業的宿命?今天dailyview網路溫度計就與列位一同來看看,大學生延畢的十大緣由事實是什麼!

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

韓語口譯價格

桃園市中壢工業區日前産生騎機車男人,對落單越南籍女子襲胸案翻譯警方受理調閱過濾路口監督器,鎖定白色噴漆遮車牌機車及男子特徵,昨晚傳喚50歲張姓須眉到案後,今依違背性騷擾防治法罪嫌函送。

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

古埃及語翻譯

下戰書三點,Ris跟Johnny 一路從林口選手村走出來,在很多青年志工中兩老顯得非分特別注視翻譯他們被放置到選手村擔負說話志工,在國際志工站供應簡略單純諮詢、失物招領、公共廣播及物品寄存等辦事翻譯

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

越文翻譯中文

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

專利翻譯服務

under- 字首(在...之下、低於)

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

斯堪的納維亞語翻譯

參考資料、文獻來曆:

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

西語口譯服務

別的,香港網友表示,合約上標明下班時候是5點,但收拾完器材後,也大約要6點才能分開公司翻譯不過每次下班時,主管城市幫他在5點時統一打卡,扣問主管後,得到的答複倒是,「合約寫5點就是下班時間,所以我們城市幫翻譯公司們統一打卡。台灣都如許。」

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

敘利亞語翻譯C/C++ 說話新手十三誡(The Thirteen Commandments for Newbie C/C++ Programmers) by Khoguan Phuann 請注意: (1) 本篇旨在提醒新手,避免初學常犯的毛病(其實熟手在行也常犯:-Q)翻譯 但不能代替完全的學習,請本身好好研讀一兩本 C 語言的好書, 並多多實作操練。 (2) 強烈建議新手先看過此文再提問,翻譯公司的問題極可能此文已經提出並 解答了。 (3) 以下所舉的毛病例子假如在翻譯公司的電腦上印出和正確例子不異的了局, 那只是不足為恃的一時僥倖翻譯 (4) 不守十三誡者,輕則履行效果的輸出數據錯誤,或是程式當掉,重則 引爆核彈、毀滅地球(若是你的 C 程式是用來控制核彈發射器的話)。 ============================================================= 目錄: (頁碼/行號) 2/24 01. 不成以利用還沒有賜與適當初值的變數 3/46 02. 不能存取跨越陣列既定局限的空間 5/90 03. 不可以提取不知指向何方的指標 7/134 04. 不要試圖用 char* 去更改一個"字串常數" 12/244 05. 不克不及在函式中回傳一個指向區域性主動變數的指標 16/332 06. 不行以只做 malloc()翻譯社 而不做相應的 free() 19/398 07. 在數值運算、賦值或比較中不可以隨便混用分歧型別的數值 21/442 08. ++i/i++/--i/i--/f(&i)哪一個先履行跟挨次有關 24/508 09. 慎用Macro 27/574 10. 不要在 stack 設置過大的變數以免堆疊溢位(stack overflow) 32/684 11. 使用浮點數精確度釀成的誤差問題 35/750 12. 不要料想二維陣列可以用 pointer to pointer 來傳遞 36/772 13. 函式內 new 出來的空間記得要讓主程式的指標接住 40/860 直接輸入數字可跳至該頁碼 或用:指令輸入行號 01. 你不成以利用還沒有賜與恰當初值的變數 毛病例子: int accumulate(int max) /* 從 1 累加到 max,傳回效果 */ { int sum; /* 未賜與初值的區域變數,其內容值是垃圾 */ for (int num = 1; num <= max; num++) { sum += num; } return sum; } 正確例子: int accumulate(int max) { int sum = 0; /* 正確的付與恰當的初值 */ for (int num = 1; num <= max; num++) { sum += num; } return sum; } 備註:  按照 C Standard,具有靜態貯存期(static storage duration)的變數, 例如 全域變數(global variable)或帶有 static 潤色符者等,  如果沒有顯式初始化的話,憑據不同的資料型態予以進行以下初始化:  若變數為算術型別 (int , double 翻譯社 ...) 時,初始化為零或正零。  若變數為指標型別 (int*, double*, ...) 時,初始化為 null 指標。  若變數為複合型別 (struct翻譯社 double _Complex, ...) 時,遞迴初始化所有成員。  若變數為聯合型別 (union) 時,只有其中的第一個成員會被遞迴初始化翻譯 (以上感激Hazukashiine板友斧正) (可是有些MCU 編譯器可能不睬會這個劃定,所以照樣請養成設定初值的好習慣) 增補資料: - 精髓區z->5->1->1->1 - C11 Standard 5.1.2, 6.2.4, 6.7.9 02. 你不成以存取跨越陣列既定局限的空間 毛病例子: int str[5]; for (int i = 0 ; i <= 5 ; i++) str[i] = i; 正確例子: int str[5]; for (int i = 0; i < 5; i++) str[i] = i; 說明:宣佈陣列時,所給的陣列元素個數值若是是 N, 那麼天成翻譯公司們在後面 透過 [索引值] 存取其元素時,所能利用的索引值規模是從 0 到 N-1 C/C++ 為了執行效力,並不會自動檢查陣列索引值是不是跨越陣列鴻溝, 我們要本身來確保不會越界。一旦越界,操作的不再是正當的空間, 將致使沒法預期的後果。 備註: C++11之後可以用Range-based for loop提取array、 vector(或是其他有供給准確.begin()和.end()的class)內的元素 可以確保提取的元素必然落在准確範圍內。 例: // vector std::vector<int> v = {0翻譯社 1, 2, 3, 4翻譯社 5}; for(const int &i : v) // access by const reference std::cout << i << ' '; std::cout << ' '; // array int a[] = {0, 1, 2, 3, 4翻譯社 5}; for(int n: a) // the initializer may be an array std::cout << n << ' '; std::cout << ' '; 補充資料: http://en.cppreference.com/w/cpp/language/range-for 03. 你不可以提取(dereference)不知指向何方的指標(包括 null 指標)翻譯 毛病例子: char *pc1; /* 未賜與初值,不知指向何方 */ char *pc2 = NULL; /* pc2 肇端化為 null pointer */ *pc1 = 'a'; /* 將 'a' 寫到不知何方,毛病 */ *pc2 = 'b'; /* 將 'b' 寫到「位址0」,毛病 */ 正確例子: char c; /* c 的內容尚未肇端化 */ char *pc1 = &c; /* pc1 指向字元變數 c */ *pc1 = 'a'; /* c 的內容變為 'a' */ /* 動態分派 10 個 char(其值不決),並將第一個char的位址賦值給 pc2 */ char *pc2 = (char *) malloc(10); pc2[0] = 'b'; /* 動態設置裝備擺設來的第 0 個字元,內容變為 'b' free(pc2); 申明:指標變數必需先指向某個可以正當操作的空間,才能進行操作翻譯 ( 使用者記得要檢查 malloc 回傳是否為 NULL, 礙於篇幅本文假定利用上皆正當,也有准確償還記憶體 ) 錯誤例子: char *name; /* name 還沒有指向有用的空間 */ printf("Your name, please: "); fgets(name,20翻譯社stdin); /* 您確定要寫入的那塊空間正當嗎??? */ printf("Hello, %s "翻譯社 name); 准確例子: /* 若是編譯期就可以決意字串的最大空間,那就不要宣告成 char* 改用 char[] */ char name[21]; /* 可讀入字串最長 20 個字元,保留一格空間放 '\0' */ printf("Your name, please: "); fgets(name,20翻譯社stdin); printf("Hello翻譯社 %s ", name); 准確例子(2): 若是在履行期間才能決意字串的最大空間,C供給兩種作法: a. 利用 malloc() 函式來動態分派空間,用malloc宣佈的陣列會被存在heap 須注意:若是宣佈較大陣列,要確認malloc的回傳值是不是為NULL size_t length; printf("請輸入字串的最大長度(含null字元): "); scanf("%u", &length); name = (char *)malloc(length); if (name) { // name != NULL printf("您輸入的是 %u ", length); } else { // name == NULL puts("輸入值太大或系統已無足夠空間"); } /* 最跋文得 free() 掉 malloc() 所分派的空間 */ free(name); name = NULL; //(註1) b. C99最先可以使用variable-length array (VLA) 須注重: - 因為VLA是被存放在stack裡,利用前要確認array size不能太大 - 不是每一個compiler都支援VLA(註2) - C++ Standard不支援(固然有些compiler支援) float read_and_process(int n) { float vals[n]; for (int i = 0; i < n; i++) vals[i] = read_val(); return process(vals, n); } 准確例子(3): C++的利用者也有兩種作法: a. std::vector (不管你的陣列巨細會不會變都可用) std::vector<int> v1; v1.resize(10); // 從頭設定vector size b. C++11以後,若是肯定陣列巨細不會變,可以用std::array 須注重:一般利用下(存在stack)一樣要確認array size不能太大 std::array<int翻譯社 5> a = { 1翻譯社 2翻譯社 3 }; // a[0]~a[2] = 1,2,3; a[3]之後為0; a[a.size() - 1] = 5; // a[4] = 0; 備註: 註1. C++的利用者,C++03或之前請用0取代NULL,C++11最先請改用nullptr 註2. gcc和clang支援VLA,Visual C++不支援 增補資料: http://www.cplusplus.com/reference/vector/vector/resize/ 04. 你弗成以試圖用 char* 去更改一個"字串常數" 試圖去更改字串常數(string literal)的成效會是undefined behavior。 毛病例子: char* pc = "john"; /* pc 現在指著一個字串常數 */ *pc = 'J'; /* undefined behaviour,後果無法猜測*/ pc = "jane"; /* 正當,pc指到在另外位址的另一個字串常數*/ /* 可是"john"這個字串照樣存在原來的處所不會消逝*/ 因為char* pc = "john"這個動作會新增一個內含元素為"john\0"的static char[5], 然後pc會指向這個static char的位址(凡是是唯讀)。 若是試圖存取這個static char[],Standard並沒有界說結果為何翻譯 pc = "jane" 這個動作會把 pc 指到另外一個沒在用的位址然後新增一個 內含元素為"jane\0"的static char[5]。 可是之前誰人字串 "john " 照樣留在原地沒有消失。 通常編譯器的作法是把字串常數放在一塊read only(.rdata)的區域內, 此區域巨細是有限的,所以假如翻譯公司反複把pc指給不同的字串常數, 是有可能會出問題的。 准確例子: char pc[] = "john"; /* pc 如今是個合法的陣列,裡面住著字串 john */ /* 也就是 pc[0]='j', pc[1]='o', pc[2]='h'翻譯社 pc[3]='n', pc[4]='\0' */ *pc = 'J'; pc[2] = 'H'; 申明:字串常數的內容應當如果"唯讀"的。您有使用權,但是沒有更改的權力。 若您進展利用可以更改的字串,那您應當將其放在合法空間 毛病例子: char *s1 = "Hello, "; char *s2 = "world!"; /* strcat() 不會另行設置裝備擺設空間,只會將資料附加到 s1 所指唯讀字串的後面, 造成寫入到程式無權碰觸的記憶體空間 */ strcat(s1, s2); 准確例子(2): /* s1 宣告成陣列,並保留足夠空間寄存後續要附加的內容 */ char s1[20] = "Hello, "; char *s2 = "world!"; /* 因為 strcat() 的返回值等於第一個參數值,所以 s3 就不需要了 */ strcat(s1, s2); C++對於字串常數的嚴厲界說為const char* 或 const char[]。 但是由於要相容C,char* 也是允許的寫法(不建議就是)。 不外,在C++試圖更改字串常數(要先const_cast)一樣是undefined behavior翻譯 const char* pc = "Hello"; char* p = const_cast<char*>(pc); p[0] = 'M'; // undefined behaviour 備註: 由於不加const輕易造成混淆, 建議不論是C照舊C++一概用 const char* 定義字串常數。 補充資料: http://en.cppreference.com/w/c/language/string_literal http://en.cppreference.com/w/cpp/language/string_literal 字串函數相關:#1IOXeMHX undefined behavior : 精髓區 z -> 3 -> 3 -> 23 05. 翻譯公司不行以在函式中回傳一個指向區域性主動變數的指標。不然,會獲得垃圾值 [感謝 gocpp 網友供給程式例子] 毛病例子: char *getstr(char *name) { char buf[30] = "hello翻譯社 "; /*將字串常數"hello, "的內容複製到buf陣列*/ strcat(buf翻譯社 name); return buf; } 申明:區域性自動變數,將會在分開該區域時(本例中就是從getstr函式返回時) 被祛除,是以呼叫端得到的指標所指的字串內容就失效了翻譯 准確例子: void getstr(char buf[], int buflen翻譯社 char const *name) { char const s[] = "hello, "; strcpy(buf, s); strcat(buf, name); } 准確例子: int* foo() { int* pInteger = (int*) malloc( 10*sizeof(int) ); return pInteger; } int main() { int* pFromfoo = foo(); } 申明:上例雖然回傳了函式中的指標,但由於指標內容所指的位址並非區域變數, 而是用動態的體例抓取而得,換句話說這塊空間是長在 heap 而非 stack, 又因 heap 空間其實不會主動回收,是以這塊空間在離開函式後,依然有用 (然則這個例子可能會因為 programmer 的忽視,遺忘 free 而造成 memory leak) [針對字串操作,C++供給了更輕易平安更直觀的 string class, 能用就盡可能用] 正確例子: #include <string> /* 並不是 #include <cstring> */ using std::string; string getstr(string const &name) { return string("hello, ") += name; } 06. [C]你不成以只做 malloc(), 而不做響應的 free(). 不然會造成記憶體漏失 但若不是用 malloc() 所獲得的記憶體,則不成以 free()。已 free()了 所指記憶體的指標,在它指向另一塊有效的動態分派得來的空間之前,不成 以再被 free(),也不行以提取(dereference)這個指標。 小技巧: 可在 free 之後將指標指到 NULL,free不會對空指標作用翻譯 例: int *p = malloc(sizeof(int)); free(p); p = NULL; free(p); // free不會對空指標有感化 [C++] 你不成以只做 new翻譯社 而不做響應的 delete (除了unique_ptr以外) 註:new 與 delete 對應,new[] 與 delete[] 對應, 不成與malloc/free混用(成果弗成猜測) 切記,做了幾回 new,就必需做幾回 delete 小技能: 可在 delete 以後將指標指到0或nullptr(C++11入手下手), 由於 delete 本身會先做檢查,因此可以免掉屢次 delete 的毛病 正確例子: int *ptr = new int(99); delete ptr; ptr = nullptr; delete ptr; /* delete 只會處理指向非 NULL 的指標 */ 備註: C++11後新增智能指標(smart pointer): unique_ptr 當unique_ptr所指物件消逝時,會主動釋放其記憶體,不需要delete翻譯 例: #include <memory> // 含unique_ptr的標頭檔 std::unique_ptr<int> p1(new int(5)); 增補資料: http://en.cppreference.com/w/cpp/memory/unique_ptr 07. 你不可以在數值運算、賦值或比較中隨意混用分歧型此外數值,而不鄭重考 慮數值型別轉換可能帶來的「意外欣喜」(驚惶)。必須隨時留意數值運算 的效果,其規模是不是會超越變數的型別 毛病例子: unsigned int sum = 2000000000 + 2000000000; /* 超越 int 寄存範圍 */ unsigned int sum = (unsigned int) (2000000000 + 2000000000); double f = 10 / 3; 正確例子: /* 掃數都用 unsigned int, 注重數字後面的 u, 大寫 U 同樣成 */ unsigned int sum = 2000000000u + 2000000000u; /* 或是用顯式的轉型 */ unsigned int sum = (unsigned int) 2000000000 + 2000000000; double f = 10.0 / 3.0; 錯誤例子: unsigned int a = 0; int b[10]; for(int i = 9 ; i >= a ; i--) { b[i] = 0; } 申明:由於 int 與 unsigned 配合運算的時刻,會轉換 int 為 unsigned, 因此迴圈條件永遠知足,與預期行為不符 毛病例子: (感激 sekya 網友提供) unsigned char a = 0x80; /* no problem */ char b = 0x80; /* implementation-defined result */ if( b == 0x80 ) { /* 不一定恒真 */ printf( "b ok " ); } 說明:說話並未劃定 char 天生為 unsigned 或 signed,是以將 0x80 放入 char 型態的變數,將會視各家編譯器分歧作法而有分歧結果 毛病例子(以下假定為在32bit機械上履行): #include <math.h> long a = -2147483648 ; // 2147483648 = 2 的 31 次方 while (labs(a)>0){ // labs(-2147483648)<0 有可能發生 ++a; } 說明:若是你去看C99/C11 Standard,你會發現long 變數的最大/最小值為(被define在limits.h) LONG_MIN -2147483647 // compiler實作時最小值不成大於 -(2147483648-1) LONG_MAX 2147483647 // compiler實作時最小值不行小於 (2147483648-1) 不過由於32bit能顯示的範圍就是2**32種,所以一般16/32bit作業系統會把 LONG_MIN多減去1,也就是int 的顯示規模為(-LONG_MAX - 1) ~ LONG_MAX翻譯 (64bit的功課系統long多為8 bytes,然則依舊符合Standard要求的最小規模) 當程式跑到labs(-2147483648)>0時,由於2147483648大於LONG_MAX, Standard告知我們,當labs的了局沒法被long有限的規模默示, 編譯器會怎麼幹就看他高興(undefined behavior)。 (不只long,其他如int、long long等以此類推) 補充資料: - C11 Standard 5.2.4.2.1, 7.22.6.1 - https://www.fefe.de/intof.html 08. ++i/i++/--i/i--/f(&i)哪一個先履行跟按次有關 ++i/i++ 和--i/i-- 的問題幾乎每月城市呈現,所以特殊強調。 當一段程式碼中,某個變數的值用某種方式被改變一次以上, 例如 ++x/--x/x++/x--/function(&x)(能改變x的函式) - 若是Standard沒有分外去界說某段敘述中哪個部分必需被先履行, 那結果會是undefined behavior(結果未知)。 - 若是Standard有出格去界說執行順序,那結果就按照履行遞次決定。 C/C++均准確的例子: if (--a || ++a) {} // ||左側先計算,假如左側為1右側就不會算 if (++i && f(&i)) {} // &&左側先計較,若是左側為0右側就不會算 a = (*p++) ? (*p++) : 0 ; // 問號左側先計較 int j = (++i, i++); // 這裡的逗號為運算子,暗示依序計較 C/C++均毛病的例子: int j = ++i + i++; // undefined behavior,Standard沒界說+號哪邊先履行 x = x++; // undefined behavior翻譯社 Standard沒界說=號哪邊先履行 printf( "%d %d %d", I++翻譯社 f(&I), I++ ); // undefined behavior翻譯社 緣由同上 foo(i++翻譯社 i++); // undefined behavior,這裡的逗號是用來分隔引入參數的 // 分隔符(separator)而非運算子,Standard沒界說哪邊先履行 在C與C++03錯誤然則在C++11開始(但不包孕C)准確的例子: C++11中,++i/--i為左值(lvalue),i++/i--為右值(rvalue)翻譯 左值可以被assign value給它,右值則不行。 而在C中,++i/--i/i++/i--都是右值。 所以以下的code在C++會准確,C則否翻譯 ++++++++++phew ; // C++11會把它解釋為++(++(++(++(++phew)))); i = v[++i]; // ++i會先完成 i = ++i + 1; // ++i會先完成 在C++17入手下手(但不包括C)才准確的例子: cout << i << i++; // 先左後右 a[i] = i++; // i++先做 a[x++] = --x; // 先處置懲罰--x,再處理a[x++] (loveflames補充) 補充資料 - Undefined behavior and sequence points http://stackoverflow.com/questions/4176328/undefined-behavior-and- sequence-points) - C11 Standard 6.5.13-17,Annex C - Sequence poit https://en.wikipedia.org/wiki/Sequence_point - Order of evaluation http://en.cppreference.com/w/cpp/language/eval_order 09. 慎用macro(#define) Macro是個像鐵鎚一樣好用又危險的工具: 用得好可以釘釘子,用不好可以把釘子打彎、敲到你手指或被抓去吃子彈。 因為macro 定義出的「偽函式」有以下瑕玷: (1) debug會變得複雜。 (2) 無法遞迴呼喚。 (3) 無法用 & 加在 macro name 之前,獲得函式位址翻譯 (4) 沒有namespace。 (5) 可能會導致新鮮的side effect或其他沒法預測的問題。 所以,利用macro前,請先確認以上的缺點是不是會影響翻譯公司的程式運行。 替代方案:enum(界說整數),const T(定義常數),inline function(界說函式) C++的template(界說可用分歧type參數的函式), 或C++11起頭的匿名函式(Lambda function)與constexpr T(編譯期常數) 以下就針對macro的弱點做申明: (1) debug會變得複雜。 編譯器不克不及對macro自己做語法查抄,只能查抄預處置(preprocess)後的成績翻譯 (2) 沒法遞迴呼喚。 按照C standard 6.10.3.4, 若是某macro的界說裡裏面含有跟此macro名稱一樣的的字串, 該字串將不會被預處置。 所以: #define pr(n) ((n==1)? 1 : pr(n-1)) cout<< pr(5) <<endl; 預處置事後會釀成: cout<< ((5==1)? 1 : pr(5 -1)) <<endl; // pr沒有界說,編譯會失足 (3) 無法用 & 加在 macro name 之前,獲得函式位址翻譯 因為他不是函式,所以你也不可以把函式指標套用在macro上。 (4) 沒有namespace。 毛病例子: #define begin() x = 0 for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) // begin是std的保留字 std::cout << ' ' << *it; 改良方法:macro名稱一概用大寫,如BEGIN() (5) 可能會導致奇異的side effect或其他無法猜測的問題翻譯 毛病例子: #include <stdio.h> #define SQUARE(x) (x * x) int main() { printf("%d ", SQUARE(10-5)); // 預處理後釀成SQUARE(10-5*10-5) return 0; } 正確例子:在 Macro 界說中, 務必為它的參數個別加上括號 #include <stdio.h> #define SQUARE(x) ((x) * (x)) int main() { printf("%d ", SQUARE(10-5)); return 0; } 不外遇到以下有side effect的例子就算加了括號也沒用。 毛病例子: (感激 yaca 網友提供) #define MACRO(x) (((x) * (x)) - ((x) * (x))) int main() { int x = 3; printf("%d "翻譯社 MACRO(++x)); // 有side effect return 0; } 增補資料: - http://stackoverflow.com/questions/14041453/why-are-preprocessor- macros-evil-and-what-are-the-alternatives - http://stackoverflow.com/questions/12447557/can-we-have-recursive-macros - C11 Standard 6.10.3.4 - http://en.cppreference.com/w/cpp/language/lambda 10. 不要在 stack 設置過大的變數以避免堆疊溢位(stack overflow) 由於編譯器會自行決意 stack 的上限,某些預設是數 KB 或數十KB,當變數所需的空 間過大時,很容易造成 stack overflow,程式亦隨之當掉(segmentation fault)。 可能造成堆疊溢位的緣由包括遞迴太屢次(多為程式設計缺陷), 或是在 stack 設置過大的變數。 錯誤例子: int array[10000000]; // 在stack宣告過大陣列 std::array<int翻譯社 10000000> myarray; //在stack宣佈過大std::array 正確例子: C: int *array = (int*) malloc( 10000000*sizeof(int) ); C++: std::vector<int> v; v.resize(10000000); 申明:建議將使用空間較大的變數用malloc/new設置裝備擺設在 heap 上,由於此時 stack 上只需配置一個 int* 的空間指到在heap的該變數,可避免 stack overflow。 利用 heap 時,雖然全部 process 可用的空間是有限的,但採用動態抓取 的體式格局,new 沒法配置時會丟出 std::bad_alloc 破例,malloc 無法設置裝備擺設 時會回傳 null(註2),不會影響到正常使用下的程式功能 備註: 註1. 利用 heap 時,整個 process 可用的空間一樣是有限的,若是需要頻仍地 malloc / free 或 new / delete 較大的空間,需注重避免造成記憶體破裂 (memory fragmentation)翻譯 註2. 由於Linux利用overcommit機制經管記憶體,malloc即便在記憶體不足時 依然會回傳非NULL的address,一樣景遇在Windows/Mac OS則會回傳NULL (感激 LiloHuang 補充) 彌補資料: - https://zh.wikipedia.org/wiki/%E5%A0%86%E7%96%8A%E6%BA%A2%E4%BD%8D - http://stackoverflow.com/questions/3770457/what-is-memory-fragmentation - http://library.softwareverify.com/memory-fragmentation-your-worst-nightmare/ overcommit跟malloc: - http://goo.gl/V9krbB - http://goo.gl/5tCLQc 11. 使用浮點數萬萬要注重精確度所釀成的誤差問題 根據 IEEE 754 的規範,又電腦中是用有限的二進位貯存數字,因此常有可 能因為切確度而造成誤差,例如加減乘除,等號大小判定,分派律等數學上 常用到的操作,很有可能是以而出錯(不成立) 更具體的說明可以參考精髓區 z-8-11 或參考冼鏡光老師所揭橥的一文 "利用浮點數最最基本的觀念" http://blog.dcview.com/article.php?a=VmhQNVY%2BCzo%3D 12. 不要料想二維陣列可以用 pointer to pointer 來傳遞 (感謝 loveme00835 legnaleurc 版友的協助) 首先必需有個觀念,C 語言中陣列是沒法直接拿來傳遞的! 不過這時候候會有人跳出來辯駁: void pass1DArray( int array[] ); int a[10]; pass1DArray( a ); /* 可以合法編譯,並且執行了局准確!! */ 事實上,編譯器會這麼看待 void pass1DArray( int *array ); int a[10]; pass1DArray( &a[0] ); 我們可以趁便看出來,array 變數自己可以 decay 成記憶體起頭的位置 是以我們可以 int *p = a; 這種體例,拿指標去接陣列。 也因為上述的例子,許多人以為那二維陣列是否是也能夠改成 int ** 毛病例子: void pass2DArray( int **array ); int a[5][10]; pass2DArray( a ); /* 這時候候編譯器就會報錯啦 */ /* expected ‘int **’ but argument is of type ‘int (*)[10]’*/ 在一維陣列中,指標的移動操作,會恰好籠蓋到陣列的局限 例如,宣佈了一個 a[10],那我可以把 a 當做指標來操作 *a 至 *(a+9) 是以天成翻譯公司們可以得到一個概念,在操作的時辰,可以 decay 成指標來使用 也就是天成翻譯公司可以把一個陣列當做一個指標來使用 (again, 陣列!=指標) 可是多維陣列中,沒法如此利用,事實上這也很直觀,試圖拿一個 pointer to pointer to int 來操作一個 int 二維陣列,這是不合理的! 儘管我們沒法將二維陣列直接 decay 成兩個指標,但是我們可以換個角度想, 二維陣列可以當作 "外層大的一維陣列,每一維內層各又包括著一維陣列" 若是想通了這一點,我們可以仿造之前的劃定規矩, 把外層大的一維陣列 decay 成指標,該指標指向內層的一維陣列 void pass2DArray( int (*array) [10] ); // array 是個指標,指向 int [10] int a[5][10]; pass2DArray( a ); 這時候就很好理解了,函數 pass2DArray 內的 array[0] 會代表什麼呢? 謎底是它代表著 a[0] 外層的那一維陣列,裡面包含著內層 [0]~[9] 也是以 array[0][2] 就會對應到 a[0][2],array[4][9] 對應到 a[4][9] 結論就是,只有最外層的那一維陣列可以 decay 成指標,其他維陣列都要 明確的指出陣列巨細,如許多維陣列的傳遞就不會有問題了 也因為剛剛的例子,天成翻譯公司們可以清晰的知道在傳遞陣列時,實際行為是在傳遞 指標,也是以若是我們想用 sizeof 來求得陣列元素個數,那是不行行的 毛病例子: void print1DArraySize( int* arr ) { printf("%u", sizeof(arr)/sizeof(arr[0])); /* sizeof(arr) 只是 */ } /* 一個指標的巨細 */ 受此限制,我們必需手動傳入巨細 void print1DArraySize( int* arr, size_t arrSize ); C++ 供給 reference 的機制,使得我們不需再這麼麻煩, 可以直接傳遞陣列的 reference 給函數,大小也能夠直接求出 准確例子: void print1DArraySize( int (&array)[10] ) { // 傳遞 reference cout << sizeof(array) / sizeof(int); // 正確獲得陣列元素個數 } 13. 函式內 new 出來的空間記得要讓主程式的指標接住 對指標不熟悉的利用者會以為以下的程式碼是吻合預期的 void newArray(int* local翻譯社 int size) { local = (int*) malloc( size * sizeof(int) ); } int main() { int* ptr; newArray(ptr, 10); } 接著就會找了好久的 bug,最後仍然搞不懂為什麼 ptr 沒有指向方才拿到的合法空間 讓我們再回首一次,並且用圖透露表現 (感謝Hazukashiine板友供給圖解) ┌────┐ ┌────┐ ┌────┐ ┌────┐ Heap │ │ │ │ │ 新配置 │ │ 已泄露 │ │ │ │ │ │ 的空間 <─┐ │ 的空間 │ │ │ │ │ │(allocd)│ │ │(leaked)│ │ │ │ │ ├────┤ │ ├────┤ │ │ │ │ │ : │ │ │ │ │ │ │ │ │ : │ │ │ : │ │ │ ├────┤ ├────┤ │ │ : │ │ │ │ local ├─┐ │ local ├─┘ │ │ ├────┤ ├────┤ │ ├────┤ ├────┤ Stack │ ptr ├─┐ │ ptr ├─┤ │ ptr ├─┐ │ ptr ├─┐ └────┘ ╧ └────┘ ╧ └────┘ ╧ └────┘ ╧   未初始化 函式呼喚 設置裝備擺設空間 函式返回 int *ptr; local = ptr; local = malloc(); 用圖看應當一切就都分明了,天成翻譯公司也不需冗言注釋 或許有人會想問,指標不是傳址嗎? 切確來講,指標也是傳值,只不外該值是一個位址 (ex: 0xfefefefe) local 接到了 ptr 指向的那個位置,接著函式內 local 要到了新的位置 但是 ptr 指向的位置照舊沒變的,因此分開函式後就好像事什麼都沒産生 ( 嚴酷說起來還發生了 memory leak ) 以下是一種解決法子 int* createNewArray(int size) { return (int*) malloc( size * sizeof(int) ); } int main() { int* ptr; ptr = createNewArray(10); } 改成如許亦可 ( 為何用 int** 就能夠?想想他會傳什麼過去給local ) void createNewArray(int** local, int size) { *local = (int*) malloc( size * sizeof(int) ); } int main() { int *ptr; createNewArray(&ptr, 10); } 如果是 C++,別忘了可以善用 Reference void newArray(int*& local, int size) { local = new int[size]; } 後記:從「古時刻」流傳下來一篇文章 "The Ten Commandments for C Programmers"(Annotated Edition) by Henry Spencer http://www.lysator.liu.se/c/ten-commandments.html 一方面它不是針對 C 的初學者,一方面它特地模仿中古英文 聖經的用語,寫得文謅謅翻譯所以我此刻另外寫了這篇,但願 能涵蓋最主要的觀念和初學乃至內行最易犯的毛病。 作者:潘科元(Khoguan Phuann) (c)2005. 感激 ptt.cc BBS 的 C_and_CPP 看板眾多網友供給珍貴定見及程式實例。 nowar100 屢次加以點竄整理,擴充至 13 項,而且製作成動畫版翻譯 wtchen 應板友要求移除動畫並憑據C/C++標準點竄內容(Ver.2016) 如發現 Bug 請推文回報,感謝您

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

察合台文翻譯是不會有『GOOGLE PLAY顯示與裝置不相容』的問題

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

希利蓋農文翻譯小妹從小沒什麼說話天份, 英文單字背五次忘四次,文法也經常搞錯, 英文成就一向欠好,對英文也沒什麼樂趣 然則因為喜歡日本文化,所以就算進修狀況一樣差,還是起勁讀日文,勉強考了個N2(但 仍是感覺程度很差...)今朝持續進修中 客歲大學卒業後才有感英文真的很主要, 很想打掉重練好好讀英文, 同時也不想放掉已有一些程度的日文, 但是發現本身在讀兩種語言經常常會打鬥... 例如: 較專心讀英文文法、單字光陰文就會大幅退步 練習英文口說時腦海中常會出現日文單字 練日文聽力時再聽到英文會忽然像外星語一樣 常看到精通三四種說話的神人出沒在ptt, 服氣戀慕之餘也知道是本身不夠努力... 但碰到這類腦內打鬥的狀況真的很無力QQ 想就教看看同時學習兩種以上說話的強者 都是怎麼戰勝這種狀態的?orz 先謝謝列位!

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()

俄文翻譯

文章標籤

vickieg11m1 發表在 痞客邦 留言(0) 人氣()