導航:首頁 > 源碼編譯 > 編譯器不做類型檢查

編譯器不做類型檢查

發布時間:2022-04-23 13:15:36

『壹』 C語言中 int a=1 printf(「%f」,a) 輸出的為什麼是0 不是1.0呢

printf 的參數並不會自動做類型轉換的。
例子中格式串中有「%f」,編譯器就會當後邊的參數是個浮點數,它不做類型檢查。
而把一個 int當成浮點數,因為兩種類型的存儲結構是完全不同的,後果就難以預料了,有可能程序崩潰,也可能正常運行,但得不到正確的結果。
具體到樓主這個問題, 把整數1當成浮點數處理,那就是符號位0,階碼0,尾數1,是非規范浮點數,不同編譯器處理結果可能不同。 所以,不要寫出這樣的代碼。

『貳』 一個C語言嘗試

C語言中雖然有變數隱含類型轉換機制,但也是有一定使用范圍的。對於printf這類不定參數函數,編譯器是不做參數類型檢查的,因此就不會知道參數應該是什麼類型,更不可能去做類型轉換了。

int(100.5)=100

『叄』 c語言吧。為什麼輸出會是1,而不是0.

printf
的參數並不會自動做類型轉換的。
例子中格式串中有「%f」,編譯器就會當後邊的參數是個浮點數,它不做類型檢查。
而把一個
int當成浮點數,因為兩種類型的存儲結構是完全不同的,後果就難以預料了,有可能程序崩潰,也可能正常運行,但得不到正確的結果。
具體到樓主這個問題,
把整數1當成浮點數處理,那就是符號位0,階碼0,尾數1,是非規范浮點數,不同編譯器處理結果可能不同。
所以,不要寫出這樣的代碼。

『肆』 C++靜態代碼檢查工具

PC Lint被稱為C / c++的PC - Lint / FlexeLint。它是由GIMPEL軟體開發的C / c++靜態代碼檢測工具,由許多大型軟體公司的程序員使用。


C++

我們知道,許多用戶從事開發C / c++編程語言,其語法沒有其他語言的靈活性,這種靈活性使促進代碼的效率,但由於C / c++編譯器不是強制性的類型檢查,不做任何邊境檢查,這就增加了代碼中存在的隱患的可能性。PC Lint,這個軟體的重點是對代碼的邏輯分析,它可以在潛在錯誤的代碼中找到,比如數組訪問跨界、內存泄漏、使用未初始化的變數等,用於檢測編譯器無法檢測到的bug通常類型。

方式

PC lint幾乎支持所有流行的編輯器和編譯器環境,例如Borland c++從1到5。xx版本,Borland c++構建,GCC,VC,watcomC / c++,insight的來源,intelC / c++,等等,也支持16 /32/ 64平台環境。

所示。支持Scott Meyes的經典(有效的c++ /更有效的c++),各種提高效率和防止錯誤的方法。

『伍』 對於C++語言來說,什麼叫做類型檢查

靜態檢查:書中對靜態檢查的闡述:「編譯器必須檢查源程序是否符合源語言規定的語法和語義要求。」由此看來,靜態檢查其實就是語義分析了。

類型系統:

類型錯誤:將int賦給一個指針就是類型錯誤。

類型檢查:檢查類型錯誤,屬於靜態檢查的一部分,編譯器實現可能有兩種情況:第一種是將中間代碼生成、類型檢查放到語法分析一起做,完成語法分析的同時進行語義分析。對於某些復雜的結構,則將類型檢查作為語法分析和中間代碼生成之間單獨的一遍。

強類型語言:某語言的編譯器保證所接受的程序不會在運行時發生「類型錯誤」,則此語言是強類型語言。

類型安全語言:將int賦給一個指針,C/C++會編譯器會抱錯,於是C/C++稱為類型安全語言.。似乎「類新安全」和「強類型」本質上一樣。

『陸』 c語言中所調用的函數實參和形參類型不一致該怎麼辦是以誰為准,還是直接編譯報錯

編譯器在編譯時默認會做類型檢查,發現行參與實參類型不一致時會提示編譯警告,如果確認賦值調用不存在賦值不兼容,且不會發生溢值現象,可以使用強制類型轉換,跳開編譯警告。此外,可以也在編譯選項中取消類型檢查。

『柒』 類型系統的類型檢查

類型檢查所進行的檢驗處理以及實行類型的約束,可發生在編譯時期(靜態檢查)或運行時期(動態檢查)。靜態類型檢查是在編譯器所進行語義分析中進行的。如果一個語言強制實行類型規則(即通常只允許以不丟失信息為前提的自動類型轉換)就稱此處理為強類型,反之稱為弱類型。 如果一個編程語言的類型檢查,可在不測試運行時期表達式的等價性的情況下進行,該語言即為靜態類型的。一個靜態類型的編程語言,是在運行時期和編譯時期之間的處理階段下重視這些區別的。如果程序的獨立模塊,可進行各自的類型檢查(獨立編譯),而無須所有會在運行時出現的模塊的那些信息,該語言即具有一個編譯時期階段。如果一個編程語言支持運行時期(動態)調度已標記的數據,該語言即為動態類型的。如果一個編程語言破壞了階段的區別,因而類型檢查需要測試運行時期的表達式的等價性,該語言即為依存類型的。
在動態類型中,經常在運行時期進行類型標記的檢查,因為變數所約束的值,可經由運行路徑獲得不同的標記。在靜態類型編程語言中,類型標記使用辨識聯合類型表示。
動態類型經常出現於腳本語言和RAD語言中。動態類型在解譯語言中極為普遍,編譯語言則偏好無須運行時期標記的靜態類型。對於類型和隱式類型語言較完整的列表參見類型和隱式類型語言。
術語推斷類型(鴨子類型,ck typing)指的是動態類型在語言中的應用方式,它會「推斷」一個數值的類型。
某些靜態語言有一個「後門」,在這些編程語言中,能夠編寫一些不被靜態類型所檢查的代碼。例如,Java 和 C-風格的語言有「轉型」可用。在靜態類型的編程語言中,不必然意味著缺乏動態類型機制。例如 Java 使用靜態類型,但某些運算需要支持運行時期的類型測試,這就是動態類型的一種形式。更多靜態和動態類型的討論,請參閱編程語言。 對靜態類型和動態類型兩者之間的權衡也是必要的。
靜態類型在編譯時期時,就能可靠地發現類型錯誤。因此通常能增進最終程序的可靠性。然而,有多少的類型錯誤發生,以及有多少比例的錯誤能被靜態類型所捕捉,仍有爭論。靜態類型的擁護者認為,當程序通過類型檢查時,它才有更高的可靠性。雖然動態類型的擁護者指出,實際流通的軟體證明,兩者在可靠性上並沒有多大差別。可以認為靜態類型的價值,在於增進類型系統的強化。強類型語言(如 ML 和 Haskell)的擁護者提出,幾乎所有的臭蟲都可以看作是類型錯誤,如果編寫者以足夠恰當的方式,或者由編譯器推斷來聲明一個類型。
靜態類型通常可以編譯出速度較快的代碼。當編譯器清楚知道所要使用的數據類型,就可以產生優化過後的機器碼。更進一步,靜態類型語言中的編譯器,可以更輕易地發現較佳捷徑。某些動態語言(如 Common Lisp)允許任意類型的聲明,以便於優化。以上理由使靜態類型更為普及。參閱優化。
相較之下,動態類型允許編譯器和解譯器更快速的運作。因為源代碼在動態類型語言中,變更為減少進行檢查,並減少解析代碼。這也可減少編輯-編譯-測試-除錯的周期。
靜態類型語言缺少類型推斷(如 Java),而需要編寫者聲明所要使用的方法或函數的類型。編譯器將不允許編寫者忽略,這可為程序起附加性說明文件的作用。但靜態類型語言也可以無須類型聲明,所以與其說是靜態類型的代價,倒不如說是類型聲明的報酬。
靜態類型允許構造函數庫,它們的用戶不太可能意外的誤用。這可作為傳達庫開發者意圖的額外機制。
動態類型允許建構一些靜態類型系統所做不出來的東西。例如,eval 函數,它使得運行任意數據作為代碼成為可能(不過其代碼的類型仍是靜態的)。此外,動態類型容納過渡代碼和原型設計,如允許使用字元串代替數據結構。靜態類型語言最近的增強(如 Haskell 一般化代數數據類型)允許 eval 函數以類型安全的方式撰寫。
動態類型使元程序設計更為強大,且更易於使用。例如 C++ 模板的寫法,比起等價的 Ruby 或 Python 寫法要來的麻煩。更高度的運行時期構成物,如元類型(metaclass)和內觀(Introspection),對靜態類型語言而言通常更為困難。

『捌』 c++ #define 和 const 有什麼區別

(1)
編譯器處理方式不同
define宏是在預處理階段展開。
const常量是編譯運行階段使用。
(2)
類型和安全檢查不同
define宏沒有類型,不做任何類型檢查,僅僅是展開。
const常量有具體的類型,在編譯階段會執行類型檢查。
(3)
存儲方式不同
define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
const常量會在內存中分配(可以是堆中也可以是棧中)。
(4)const
可以節省空間,避免不必要的內存分配。
例如:
#define
PI
3.14159
//常量宏
const
doulbe
Pi=3.14159;
//此時並未將Pi放入ROM中
......
double
i=Pi;
//此時為Pi分配內存,以後不再分配!
double
I=PI;
//編譯期間進行宏替換,分配內存
double
j=Pi;
//沒有內存分配
double
J=PI;
//再進行宏替換,又一次分配內存!
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而
#define定義的常量在內存中有若干個拷貝。
(5)
提高了效率。
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

『玖』 C++編程中const和#define的區別

(1) 編譯器處理方式不同
define宏是在預處理階段展開。
const常量是編譯運行階段使用。
(2) 類型和安全檢查不同
define宏沒有類型,不做任何類型檢查,僅僅是展開。
const常量有具體的類型,在編譯階段會執行類型檢查。
(3) 存儲方式不同
define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
const常量會在內存中分配(可以是堆中也可以是棧中)。

(4)const 可以節省空間,避免不必要的內存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此時並未將Pi放入ROM中 ......
double i=Pi; //此時為Pi分配內存,以後不再分配!
double I=PI; //編譯期間進行宏替換,分配內存
double j=Pi; //沒有內存分配
double J=PI; //再進行宏替換,又一次分配內存!
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而 #define定義的常量在內存中有若干個拷貝。
(5) 提高了效率。 編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

『拾』 void main與void main(void) 有什麼不一樣

你是想問
void main() 與 void main(void)
的區別吧?

若是在C++里,沒有區別,但是,對於早期C程序的函數而言,聲明的參數列表為空或者void,都是一個意思——參數任意!也就是說,你可以像該函數傳遞任何參數,編譯器不做類型檢查!某些情況下,這是非常危險的。因此,在C++里,編譯器對此的解釋就是:該函數沒有任何參數!如果你像該函數傳遞參數,編譯器會報錯。

舉個例子:
C中:
void fun(void);
調用時,你可以傳遞任何參數;例如:
int a; float f; char c;
fun(a); fun(f); fun(c);
都是對的。因為編譯器不會檢查該函數的參數都是什麼。

C++中:你只能這么調用該函數:
fun();
不能有任何參數!

char option = '\0'
是定義一個char類型的變數option,並初始化為'\0'字元,\0是一個完整的字元,多用於字元串處理中,代表字元串的結束,例如,你以一個char型數組儲存字元串,編譯器會自動在末尾補以'\0'字元,以示字元串的結束。比如:
char buffer[] = "abcd";
實際上buffer數組是這個樣子:
'a''b''c''d''\0'
分別對應buffer[0],buffer[1],...,buffer[4]
有4+1=5個元素。

閱讀全文

與編譯器不做類型檢查相關的資料

熱點內容
pdf加密一機一碼 瀏覽:600
怎麼把百度雲資源壓縮 瀏覽:456
不會數學英語如何編程 瀏覽:88
如何能知道網站伺服器地址 瀏覽:648
程序員月薪5萬難嗎 瀏覽:138
如何評價程序員 瀏覽:803
雲虛機和伺服器的區別 瀏覽:403
廣西柳州壓縮機廠 瀏覽:639
arm開發編譯器 瀏覽:833
51單片機的核心 瀏覽:746
看電視直播是哪個app 瀏覽:958
將c源程序編譯成目標文件 瀏覽:787
再要你命3000pdf 瀏覽:558
ai軟體解壓軟體怎麼解壓 瀏覽:520
文件夾怎樣設置序列號 瀏覽:963
javascriptgzip壓縮 瀏覽:248
易語言怎麼取出文件夾 瀏覽:819
蘋果xs手機加密app哪裡設置 瀏覽:605
超聲霧化器與壓縮霧化器 瀏覽:643
模擬實現進程調度演算法 瀏覽:388