可怕的 C 語言

2021-10-21 04:11:11 字數 875 閱讀 7060

據我對 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,...