導航:首頁 > 源碼編譯 > 哪些會被編譯器禁止

哪些會被編譯器禁止

發布時間:2022-09-28 10:10:14

編譯器不會強制程序員處理哪種異常

java編譯器中,是不會強制要求程序員進行處理Runtime異常的。

RuntimeException類及其子類的實例被稱為運行時異常,即UnChecked Exception。

我們較為常見的NullPointerException(空指針異常)和 IndexOutOfBoundsException(數組越界異常),對於這些Runtime異常。

在java編譯器中是不會強制要求程序員進行處理或聲明的(有些IDE可能會給可能出現Runtime異常問題的提示,但不會報錯)。

常見的RunTime異常幾種如下:

NullPointerException - 空指針引用異常。

ClassCastException - 類型強制轉換異常。

IllegalArgumentException - 傳遞非法參數異常。

ArithmeticException - 算術運算異常。

ArrayStoreException - 向數組中存放與聲明類型不兼容對象異常。

IndexOutOfBoundsException - 下標越界異常。

NegativeArraySizeException - 創建一個大小為負數的數組錯誤異常。

NumberFormatException - 數字格式異常。

SecurityException - 安全異常。

UnsupportedOperationException - 不支持的操作異常。

② 怎樣讓c++編譯器禁止使用某個函數

可以用條件編譯
#ifdef 常量
// 語句塊
#endif
這段意思是如果常量被宏定義過,則編譯語句塊,否則不編譯。
還有其他的條件編譯語句,可以查詢相關資料。
不明白的聯系我,希望能幫助你。

③ C++中內聯函數何時被編譯器禁止


內聯函數
的函數體很大時,
編譯器
不會按照內聯函數進行編譯,按普通函數進行編譯

④ 哪些語言容易被反編譯

Java程序編譯後的結果是Java Bytecode,而.NET編譯後的結果是CIL(Common Intermediate Language),兩者都具有下列的特性:

-同為堆棧式(stack-based)指令集。

-同為高階面向對象機器語言

-和平台無關

-Code Validation

-Symbolic Link

上述任何一點特色,都可以讓程序變得更容易反編譯,全部五點結合起來更是不得了。所以要反編譯Java和.NET可以說是相當容易的。網路上就到處流傳著Java的反編譯器(decompiler),可以把編譯後的檔案反推出原始碼,

⑤ 為什麼靜態成員函數的外部「C」聲明是被禁止的

這就意味著C連接會保證可以從使用其它編程語言寫成的模塊里調用一個函數——例如C、Fortran和COBOL——因為函數名是以一種大多數非C++的編譯器和連接器都很熟悉的方式修飾的。一個有趣的問題是,將靜態成員函數的聲明作為外部「C」是否被允許。例如:struct C{extern "C" static void f(int); // valid? }; 答案是不行。C++的標準是不允許成員函數,不論是靜態的還是非靜態的,被作為外部「C」聲明。第一眼看上去,這個決定似乎過於嚴厲,因為你會把指向靜態成員函數的指針作為普通函數的指針來對待,如下面的例子所示:void (*pf) (int) = &C::f; // OK 名稱修飾你不能將靜態成員函數作為外部「C」來聲明有一個很合理的理由:名稱修飾(也叫做name mangling)。C++的名稱修飾是編譯器將函數的名稱轉變成為一個唯一的字元串的過程,這個字元串會對函數的類、其命名空間、其參數表,以及其他等等進行編碼。C++的命名修飾適用於靜態成員函數,也適用於非靜態成員函數。靜態函數的命名修飾的一個好處之一,是能夠在不同的類里使用同一個名稱來聲明兩個或者更多的靜態成員函數——而不會發生名稱上的沖突。考慮一下下面的情況:struct C{static void f(int);};struct D{static void f(int); // doesn't clash with C::f }; f()的外部「C」聲明會禁止命名修飾;如果它被允許的話,那麼不同類里具有相同名稱的靜態成員函數就會相互沖突。它的不足之處是,你不能從使用其它語言寫成的模塊里調用這些函數,因為它們有C++連接。本文作者Danny Kalev 是一個系統分析家、軟體工程師,在C++和面向對象設計方面有著14年的專業經驗。

⑥ 請問下列表達式哪些會被編譯器禁止

1.第一句中的第一個分號應該改成逗號;因為這樣的語句被編譯器解析為b無類型!
2.const int *d=&a;也不能通過編譯,因為同過a變數能夠更改d的值,這是不允許的!
3.同2,int const *f const =&a;這句也不能通過!

⑦ 程序員9個不良編程習慣

我們曾經都做過這樣的事情:當媽媽不注意的時候,偷偷地吃糖果零食,然後導致有了蛀牙。同樣的,我們都違背過一些編程的基本規則,並且都會堅定地表示這種行為是不可取的。但我們就是偷偷愛著這些不良的編程習慣。


我們對所謂的編程規則嗤之以鼻,輸出的代碼也很糟糕——但我們依然活著。編程上帝沒有下閃電劈死我們,我們的電腦也沒有爆炸。事實上,只要我們能編譯和發布代碼,客戶似乎就很滿意了。


這是因為糟糕的編程不像安裝電路或者摸老虎屁股那樣有直接的危害性。大多數時間里它也是可以工作的。規則通常是作為一種指導或格式上的建議,並沒有硬性規定一定要遵守,也不會導致代碼馬上死掉。當然,你的代碼可能會被人恥笑,甚至可能大家公開嘲笑你,不過,這種挑戰慣例的行為可以讓人增加一點顛覆傳統的快感,哪怕是在不經意間。


為了讓問題變得更加復雜,有時候違反規則反而更好。(一般人我不告訴他!)出來的代碼會更干凈,甚至可能會更快和更簡單。規則通常顯得太過於寬泛,有技巧的程序員可以通過打破這些規則來提高代碼。不要告訴你的老闆,這對你的編碼生涯會很有意義。


下面這9個編碼習慣,雖然在編程規則中是被駁斥的,但我們很多人就是會不由自主地使用它們。


編程習慣No.1:使用goto


關於禁止使用goto可以追溯到許多結構化編程工具還未面世的時代。如果程序員想要創建一個循環或跳到另一段程序中,那麼他們需要輸入goto後再跟一個行號。過了幾年之後,編譯器團隊讓程序員使用字元串標簽取代行號。這在當時被認為是一個熱門的新功能。


有的人認為這會導致「義大利面條式代碼」。代碼會變得不可讀,並且很難理解代碼的執行路徑。線程混亂,纏纏綿綿到天涯。Edsger
Dijkstra就三令五申地表示應該禁止這個命令,他有一份詼諧的手稿,題目為《Goto語句害人不淺》。


但絕對的分支是沒有問題的。這就讓人糾結了。通常,巧妙的break語句和return
語句可提供一個非常干凈的關於代碼在那個時候執行什麼的聲明。有時候,添加goto
到case語句會比更恰當的多級嵌套的if-then-else語句塊更易於理解。


也有反例。在蘋果的SSL堆棧中的「goto
fail」安全漏洞就是最好的例子之一。但是,如果我們能夠仔細避免case語句和循環的一些尷尬問題,那麼我們就可以嵌入良好的絕對轉移,使閱讀代碼的人更容易明白這是怎麼回事。我們可以插入break和return
語句,讓每一個人感覺更清潔和更愉快——可能得除了goto的敵視者。


編程習慣No.2:成功避開文檔


我的一個朋友有一個非常精明的老闆,這位老闆雖然從來沒有寫過任何代碼,但卻秉持著每一個功能都必須包含在文檔中的理念。哪個程序員不提供注釋,那麼他就會受到懲罰。所以,我的朋友在他的編輯器中聯入了一個有點像人工智慧的玩意兒,於是乎,他的每一個功能就都有幾行「文檔」了。因為這位精明的老闆還不夠聰明到能理解這些注釋其實啥意思也沒有,所以我的朋友逃過一劫。他的代碼常常被作為正式文檔。我想,他應該快要升職了!


許多函數方法,甚至一些類或多或少都能自文檔化。冠以insertReservation或cancelReservation或deleteAll
等名稱的函數並不需要多此一舉來解釋它們的作用。為函數取一個正確的名字往往就足夠了。事實上,這比寫一段長長的注釋要好,因為函數名可以出現在代碼中的其他地方。而文檔只能默默地呆在某個角落。自文檔化的函數名可以改進它們出現的每個文件。


在有些情況下,寫文檔甚至會導致情況變糟。例如,當代碼瞬息萬變,團隊像瘋了似的重構的時候,文檔會產生分歧。代碼是這樣寫的,但文檔解釋的還是四五個版本以前的情況。這類「過時」的文檔通常位於代碼頂部,有的人會在這里對代碼應該發生什麼作一個美好總結。因此,盡管重構團隊已經仔細修改了相關的注釋,但還是會遺漏文件頂部的這段「美好總結」。


當代碼和文本出現分歧的時候,注釋就變得毫無價值,甚至會產生誤導。在這樣的情況下,良好的自文檔化的代碼顯然勝出了。


編程習慣No.3:一行寫太多代碼


老闆突然發神經地給團隊發了一封討厭的郵件:為了執行非常嚴格的風格規定,我們大家都必須重寫我們的代碼。最神奇的要求是:每個行為或步驟或子句必須各自成行。你不能使用點語法連續調用函數。在一個分支語句中,你不能有兩個及以上返回布爾值的子句。如果要定義變數,那麼另起一行。如果你正在做一個復雜的計算,那麼不要使用括弧。每個片段也自成一行。


他認為他的這個法令將能使調試變得更加容易。就像你單步調試代碼一樣,調試器會一個動作一個動作地前進。這樣就不會卡在某一行。而且更容易執行。


但是這樣一來,鍵盤上的回車鍵煩不勝煩,因為我需要不斷地插入行。而且我敢肯定,老闆因此還可以到處吹噓他的團隊能寫多少行代碼。


唉,有時在同一行中聲明一堆變數反而更容易;有時把所有的布爾子句放在一起反而更簡單——一切都能變得更加緊湊。那也意味著,我們可以在屏幕上看到更多的邏輯而無需滾動滑鼠。更易於閱讀就意味著理解起來更快。這才是簡單的精粹。


編程習慣No.4:不聲明類型


那些熱愛類型化語言的人認為,如果為每個變數添加明確的數據類型聲明,就可以寫出更好的、沒有錯誤的代碼。花一點時間來拼寫類型,能幫助編譯器在代碼開始運行之前標志愚蠢的錯誤。可能會讓人覺得痛苦,但很有幫助。這是編程中停止bug的一種有備無患的方法。


但是時代變了。許多較新的編譯器完全可以智能地通過查看代碼來推斷類型。它們會向後和向前瀏覽代碼,直到可以肯定這個變數是string
還是int,抑或其他。如果這些被查看的類型不成隊列,那麼錯誤標志就會點亮。因此再也不需要我們輸入變數的類型了。


這意味著我們現在可以在代碼中省略掉一些最簡單的聲明。代碼更清潔,而且閱讀代碼的人也猜得出for循環中命名為i的變數表示一個整數型。


編程習慣No.5:搖擺不定的代碼


有的程序員在代碼上特別優柔寡斷,猶豫不決。先是一開始將值存儲為字元串,然後又解析成整數。接著又轉換回字元串。這是非常低效的,你甚至可以感覺到CPU在咆哮這種浪費負載的行為。聰明的程序員之所以能快速地編碼,是因為他們事先會設計架構,以盡量減少轉換。他們的代碼能更快地運行是因為他們有一個良好的規劃。


但是,不管你信不信,這種搖擺不定的代碼有時候也是有意義的。比如說,你有一個非常棒的庫,在它專有的黑盒子里能做無數智能的事情。如果庫需要字元串的數據,那麼你就給它字元串,即使你剛將這個數據轉換成為整數型。


當然,你可以重寫所有的代碼,以盡量減少轉換,但是這需要時間。而且,有時候讓代碼稍微多花點額外時間來運行也未嘗不可,因為重寫代碼需要耗費我們更多的時間。有時,背負這樣的技術債務比一開始就正確構建的成本要更低。


有的時候,庫不是專有的代碼,但那些你以前全部自己寫的代碼是你獨有的。有的時候,再次轉換數據比重寫庫中的所有代碼要快得多。所以,就讓它這樣吧,就讓代碼搖擺吧。


編程習慣No.6:編寫你自己的數據結構


有一個標准規則是,程序員在完成數據結構課程的第二年,不應該寫用於存儲數據的代碼。基本上我們需要的所有的數據結構,已經有人寫好了,而且其代碼已歷經多年的測試和再測試。它和語言捆綁在一起,而且常常是免費的。你的代碼只能造就bug。


但有時你會發現數據結構庫有點慢。有時它們會迫使我們使用標準的,但於我們的代碼卻是錯誤的結構。有時庫會把我們推向在使用結構之前重新配置數據的地步。有時庫會包含一些所謂有備無患的保護功能,如線程鎖,但其實我們的代碼並不需要。


如果遇到這種情況,那麼就應該著手寫我們自己的數據結構。這或許能讓你做得更快,做得更多。而且代碼會變得更清潔,因為我們不會包括那些多餘的用於格式化數據來完成一些功能的代碼。


編程習慣No.7:在中間打破循環


有一個規則制定小組宣稱,每個循環都應該有一個「常量」,也就是說當這個邏輯語句為true的時候,循環一直執行。當常量一定不會是true的時候,循環才會結束。這是考慮復雜循環的好方法,但它會導致愚蠢的禁令——例如禁止我們在循環中間使用return
和break語句。這一條也包含在禁止goto語句的規則中。


這個理論是好的,但它通常會導致更復雜的代碼。請看下面這個簡單的案例,遍歷數組,將找到的元素傳遞給test函數,並將該元素返回:


while(i


...


if(test(a[i])thenreturna[i];


...


}


「循環常量」愛好者會要求我們增加一個布爾變數,命名為notFound,然後這樣使用:


while((notFound)&&(i


...


if(test(a[i]))thennotFound=false;


...


}


如果這個布爾值能夠合理地命名,那麼這就是一段很棒的自文檔化的代碼,更易於大家理解。但這也增加了復雜性。這意味著你需要分配另一個局部變數,並堵塞寄存器,因為編譯器也許還不能足夠智能到解決這個問題。


有時候,一個goto語句或一個跳轉會更干凈利索。


編程習慣No.8:使用短變數名(i和x和and也是有意義的)


EdgarAllan
Poe這位詩人和小說家曾經說過,在一個故事中的每一個詞都應該是有內涵的。編碼規則也強調如此。變數名應該說明這個變數的所作所為。那些使用駝峰式大小寫的方法來寫變數名,以表達關於變數細節的Java程序員深以為然,於是一個又一個瘋狂長度的變數名出爐了。有些程序員寫的變數名,會組合五六個甚至更多的詞語。


但有的時候,使用單個字母作為變數名反而會更方便。有時在循環迭代中只使用i或j會更簡單。有時使用字母a代表array
,l代表list會更便捷,即使是字母l和數字1看上去很難辨別。


正如這篇文章前面鼓勵的是自文檔化的代碼,而非長長的注釋。在上述情況下,單個字母的變數名也是自文檔化的。字母i
是通用的迭代器。只要是程序員立刻就會懂。


編程習慣No.9:重新定義運算符和函數


一些最有趣的編程語言允許你去做一些特別詭異的事情,例如重新定義元素的值,就如同常量一般。例如Python,你可以輸入TRUE=FALSE(在Version2.7及之前的版本)。這並不會產生某種邏輯崩潰,或導致宇宙終結——僅僅只是互換了TRUE和FALSE的含義。你也可以在C預處理器和一些其他語言中玩玩類似於這樣的危險游戲。還有一些語言允許你重新定義運算符,如加號。


當然這是延伸了,不過有一個觀點是,在一個大的代碼塊內,當重新定義一個或多個所謂的常量時,速度會更快。有時老闆會要求代碼做一些截然不同的事情。當然,你可以修改代碼的每個事件,或者,你可以重新定義。這讓你看上去像一個天才。不必重寫一個龐大的庫,只需翻轉一下,就可以做相反的事情了。


這9個習慣就都在這兒了。千萬不要輕易嘗試,不管它看上去有多牛掰。太危險了——真的,這是實話。

⑧ 是否有一些編譯器不允許函數定義中的參數包括類型名

老式寫法,類型後寫,例如:
#include <stdio.h>
void f(a,b)
int a,b;
{
printf("%d",b + a);
}
void main()
{
f(1,2);
}

⑨ 怎樣讓c++編譯器禁止使用某個函數

可以用
條件編譯
#ifdef
常量
//
語句塊
#endif
這段意思是如果常量被
宏定義
過,則編譯語句塊,否則不編譯。
還有其他的條件編譯語句,可以查詢相關資料。
不明白的
聯系我
,希望能幫助你。

⑩ c語言的注釋中存在錯誤會被編譯器檢查出來

不會。
所謂注釋,便是用自然語言對源代碼中某些語句或方法進行說明。並且注釋的內容不會被編譯器編譯。可以在源代碼中添加任何想要添加的說明。
注釋可以出現在代碼中的任何位置,用來向用戶提示或解釋代碼的含義。程序編譯時,會忽略注釋,不做任何處理,就好像它不存在一樣。

閱讀全文

與哪些會被編譯器禁止相關的資料

熱點內容
javaforever 瀏覽:636
女主叫桃子的微電影 瀏覽:449
藍光超清1080p影視 瀏覽:296
男變女懷孕並生孩子的小說 瀏覽:344
安卓怎麼玩出蘋果的軟體 瀏覽:92
除了80以外還有啥看電影 瀏覽:369
加密分享可以採用的演算法 瀏覽:686
請問誰有免費的男人網站? 瀏覽:75
58pdf 瀏覽:768
年輕人愛看的免費的電影網站 瀏覽:782
天津水游城電影院今日影訊簡介 瀏覽:99
lin運演算法則 瀏覽:574
天刀命令 瀏覽:132
韓國電影在閣樓偷窺女主的 瀏覽:417
葉天明與柳韻小說 瀏覽:517
優盤加密文件和投屏沖突 瀏覽:537
韓國推理電影免費在線觀看 瀏覽:646
php修改資料庫欄位 瀏覽:431
老司機看片入口 瀏覽:890
梁山正信樓電影院買票入口 瀏覽:59