據我對 c 語言的了解,c 語言不會在目標**(本地機器指令程式)種儲存任何 「元資料」。也就是說,c 的型別只起提示編譯器字段長度和幫助編譯器選擇基本操作的作用。
而且,c 語言的各個原始檔是完全分開編譯的,可以說根本就沒有模組系統。
下面的例子展示了 c 語言狂野的一面:
file1.c
#include
intadd
(int x)
;int
main()
file2.c
int
add(
int x,
int y,
int z)
你是否認為,由於在 file1.c 中宣告的 add 簽名和 file2.c 中的不同,程式無法編譯呢?其實並不會,宣告只能讓編譯器幫你檢查當前檔案。跨檔案的簽名不一致根本不會觸發編譯錯誤,甚至連警告都沒有。
在 windows 中一次下達命令:
gcc -c -wall file1.c
gcc -c -wall file2.c
gcc -o main.exe -wall .\file1.o .\file2.o
編譯大成功。
然後執行,main.exe,得到結果,
98374驚人之處頗多:18 18
不一致的函式簽名,編譯成功了。
沒有執行時函式引數數量的正確性的檢查,把不知道是什麼的資料加起來了……
沒有陣列邊界檢查,陣列賦值影響到其他變數了……
總之,尤其是涉及到指令、陣列的操作的時候,c 語言保護不了你。
C 可怕的宇宙射線
宇宙射線會在無限的二維平面上傳播 可以看做乙個二維網格圖 初始方向預設向上。宇宙射線會在發射出一段距離後 向該方向的左右45 方向 出兩條宇宙射線,同時威力不變!宇宙射線會 n 次,每次 後會在 方向前進 ai個單位長度。求有多少個位置會被打擊。輸入第一行包含乙個正整數n n 30 表示宇宙射線會 ...
可怕的階乘
計算階乘n 是一件可怕的事情,因為當n並不是很大時,n 將是乙個很大的值。例如13 6227020800,已經超過了我們常用的unsigned int型別的取值範圍。請設計乙個程式,使其可以計算100以內的數的階乘,結果用字串的形式輸出 詳細描述 介面說明 原型 void calcnn int n,...
可怕的階乘
計算階乘n 是一件可怕的事情,因為當n並不是很大時,n 將是乙個很大的值。例如13 6227020800,已經超過了我們常用的unsigned int型別的取值範圍。請設計乙個程式,使其可以計算100以內的數的階乘,結果用字串的形式輸出 詳細描述 介面說明 原型 void calcnn int n,...