国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++調試過程中如何檢查語法錯誤

2020-05-23 14:26:30
字體:
來源:轉載
供稿:網友
所謂語法錯誤是指在書寫語句時沒有按照相應的語法格式。常見的語法錯誤有變量未定義、括號不匹配、遺漏了分號等等。大多數的語法錯誤都是能夠被編譯器發現的。因此相比于語意錯誤,語法錯誤更容易被發現,更容易被解決。

語法檢查的工作由編譯器完成,很多情況下編譯器無法智能地報告出真正的語法錯誤數和錯誤位置。比如缺少一個變量的定義,而該變量在程序中被使用了6次,則編譯器可能會報告6個甚至更多的語法錯誤,而實際上錯誤只有一個。所以,對編譯器來說,任何一個語法錯誤都可能是“牽一發而動全身”的。

那么在這種可能發生“誤報”的情況下,我們如何快速、正確地找到錯誤的位置呢?

由于編譯器是按順序查找語法錯誤的,所以它所找到的第一個錯誤的位置往往是正確的。如果程序規模不大,編譯一次的時間不是很長,我們可以每次只修正編譯器報告的第一個錯誤以及由此可以發現的連帶錯誤,直到整個程序沒有任何錯誤為止。

下面我們就用這種方法來檢查一個程序的語法錯誤:(程序11.3.1)
#include <iostream>
mian()
{
   int a,b;
   for (i=0,i<3,i++)
   {
      cin >>a >>b;
      c=a+b;
      cout <<c <<endl;
   }
   return 0;
}
第一次編譯的第一個錯誤:
I:/program/vc/book/11_3_1/main.cpp(5) : error C2065: 'i' : undeclared identifier//未聲明的標識符
……
main.obj - 7 error(s), 3 warning(s)//一共還有7個錯誤和3個警告

第一次修改:
for (int i=0,i<3,i++)
第二次編譯的第一個錯誤:
I:/program/vc/book/11_3_1/main.cpp(5) : error C2143: syntax error : missing ',' before '<'//逗號語法錯誤
……
main.obj - 8 error(s), 3 warning(s) //一共還有8個錯誤和3個警告

第二次修改:
for (int i=0;i<3;i++)
第三次編譯的第一個錯誤:
I:/program/vc/book/11_3_1/main.cpp(7) : error C2065: 'cin' : undeclared identifier//未聲明的標識符
……
main.obj - 4 error(s), 3 warning(s) //一共還有4個錯誤和3個警告

第三次修改:
添加using namespace std;
第四次編譯的第一個錯誤:
I:/program/vc/book/11_3_1/main.cpp(9) : error C2065: 'c' : undeclared identifier//未聲明的標識符
……
main.obj - 1 error(s), 1 warning(s)//一共還有1個錯誤和1個警告
第四次修改:
int c=a+b;
第五次編譯的第一個錯誤:
I:/program/vc/book/11_3_1/main.cpp(12) : warning C4508: 'mian' : function should return a value; 'void' return type assumed//函數需要返回一個值
……
main.obj - 0 error(s), 1 warning(s) //一共還有1個警告

第五次修改:
int mian()
第六次編譯:
main.obj - 0 error(s), 0 warning(s)//編譯正確
第一次連接的第一個錯誤:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main//沒有main函數
……
11_3_1.exe - 2 error(s), 0 warning(s)//一共還有2個錯誤

第六次修改:
int main()
第七次編譯:
main.obj - 0 error(s), 0 warning(s)//編譯正確
第二次連接:
11_3_1.exe - 0 error(s), 0 warning(s)//連接正確

完整的程序:
#include <iostream>
using namespace std;
int main()
{
   int a,b;
   for (int i=0;i<3;i++)
   {
      cin >>a >>b;
      int c=a+b;
      cout <<c <<endl;
   }
   return 0;
}

至此,整個程序的所有語法錯誤都被檢查出來并且被修正。程序編譯階段沒有任何錯誤了。通過對這個程序的語法檢查,我們總結出以下幾點:
  1. 編譯器所報告的第一個錯誤位置往往是有效的,但是報告的錯誤內容未必正確。比如第二次編譯時報告的錯誤是“在小于號之前缺少了逗號”,而事實上問題是for語句中應該使用分號。所以,報告的錯誤內容只能參考,卻不能完全相信。
  2. 編譯器報告的錯誤數目與實際錯誤數目未必符合。甚至第一次改正一個錯誤后,錯誤數反而增加了。所以,報告的錯誤數目不能正確描述實際的錯誤規模。
  3. 編譯器報告的警告也應當被重視。有些人認為即使程序存在警告,但是它能正常執行,所以警告可以被忽視。這種想法是錯誤的。如果一個程序是完美的,為什么編譯器還要給出警告呢?警告的存在就說明了這個程序有些地方還不符合正確的語法。
  4. I:/program/vc/book/11_3_1/main.cpp(5)括號中的5表示錯誤在程序的第5行。我們不需要自己去數行數,只需要雙擊這個錯誤就能到達對應的行。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁山县| 云林县| 五华县| 巨鹿县| 满洲里市| 南汇区| 丰原市| 萨嘎县| 保定市| 清原| 尚志市| 平武县| 长垣县| 慈溪市| 宁南县| 高州市| 宜宾县| 迁西县| 莱西市| 祁阳县| 嫩江县| 比如县| 清徐县| 柘城县| 通渭县| 合川市| 江津市| 眉山市| 长春市| 康马县| 寿阳县| 车险| 东乌珠穆沁旗| 磐石市| 西城区| 绍兴市| 界首市| 眉山市| 行唐县| 建湖县| 博野县|