2011-10-21 15 views
5

基本上有三種類型的錯誤。什麼是語義錯誤在C語言及舉一些例子?

1)語法錯誤。這些是編譯器無法理解的無效代碼,例如你在C中用一個整數乘以一個字符串的例子。編譯器會檢測它們,因爲它不能編譯它們。

2)語義錯誤。這些是編譯器可以理解的有效代碼,但它們不是程序員所打算的。這些可能會使用錯誤的變量,錯誤的操作或錯誤順序的操作。編譯器無法檢測到它們。

還有第三類,這可能是最昂貴的:

3)設計錯誤。代碼是正確的,沒有錯誤,並且完全符合你的意圖。但你的意圖是錯誤的,例如基於錯誤的假設,錯誤的模型,或者你使用了錯誤的公式,誤解了客戶等等。

+1

這不是「教我編程的網站」,這是一個「修復我的問題「網站。發佈有關特定問題的問題,但不要求爲衆多主題提供一攬子定義 – KevinDTimm

+1

是啊......閱讀@ KevinDTimm的評論幾次。這個網站是這樣的,如果你有一個語義(邏輯)錯誤並且不知道你的代碼出了什麼問題,你會發布你的代碼並尋求幫助以解決問題。鑑於你可能只是搜索了語義錯誤這個詞,並發現了它的意思。 – Gabe

回答

5

這是一個語義錯誤:

// add one to x 
x -= 1; 

所以這是:

// add one to x 
y += 1; 

而且,更逼真地:

// update all elements of A 
for (size_t i=1; i<n; i++) 
    update(A[i]); 

(跳過A[0]

6

甲簡單的例子一個sematical錯誤的E:

int CalculateArea(int width, int height) 
{ 
    return width + height; // semantic error - you really should multiply to get the area 
} 

這是合法的C++,但會不會像你想,如果你用它尋找一個矩形的面積。

+2

除非你打算讓下一個程序員讀你的代碼。 :-) –

3

語義錯誤只是意味着「邏輯錯誤」,在那裏你字面上寫正確的代碼,但它背後的邏輯使得它做一些事情,你沒有想到的,而不是你想要的東西。例如,書寫N3 = n1 * n2當你真的想分割 - 編譯器無法告訴你打算分割而不是乘法;你告訴它要繁殖,所以它確實如此。

7

一整類語義錯誤都涉及到優先級:

if(a + b << c == d) // Are you sure this does what you expect? 

或意外的分配:

if(a = b) // do you really want to assign here?