目录:

导言:

语法错误:

语义错误:

区分语法错误与语义错误:

语义错误很可怕:

导言:

在我们日常写代码的日子里,难免会写出然我们意想不到的Bug(错误)但你也不需要担心,我们每一次写完Bug之后在此基础上修改时,其实都是在提升自己,避免以后再次遇到这种情况。无论你到底写出了什么样的Bug,这些Bug多半会分为两大类:语法Bug和语义Bug,但在技术领域中我们统称它们为:语法错误和语义错误。可能有些读者不明白这两个错误,所以为了帮助这类读者才有了这一篇文章。下面,我将逐一介绍这两个错误。

语法错误:

何为语法错误?你只需要知道导致编译器不可以正常执行程序的语句,这时语句的错误叫作语法错误。譬如在某个语言当中一个语句的结尾处忘了加上”;“,函数名写错等等,这都会导致编译器不可以执行我们所写的程序。但为了使读者更好理解作者所说的意思,所以在下文中我们会用一个例子来更好地说明”语法错误“这个概念:

假设小明开发了一个编程语言,这个编程语言中有一个函数叫作“print”,这个函数我们用于输出字符串,它可以把后面的字符串输出到控制台,之后要以一个“;”代表一条语句的结束,所以我们使用小明所开发的编程语言想要在控制台输出“Hello World”,我们应在他的编译器上这样输入:

print "Hello World";

但是小东在使用小明的编程语言输出“Hello World”时,不小心将表示语句结束的“;”给忘了

print "Hello World"

所以导致小东的代码执行不起来。在上文我们也说了,导致编译器不可以正常执行程序的语句,这时语句的错误叫作语法错误,所以小东写的这一条语句的错误是语法错误。

相信上文的例子可以让更多的读者理解“语法错误”这个概念。既然语法错误我们已经讲解完了,我们是时候该讲讲语义错误了。

语义错误:

还是小明这个编程语言开发者,也还是小东这个“编程语言”爱好者, 小明想要让小东输出一个字符串来证明此语言没有bug,因此小东要在这个编程语言中输出一个字符串,这个字符串叫做“string”,但小东这个“粗心大意”又误把“string”这个字符串的中“g”写成了与“g”相邻的“h”,所以小东在编译器输入的代码是这样的:

print"strinh";

这个代码运行的结果似乎不是小东理想的结果,小东理想的结果是“string”,但编译器给出的结果是“strinnh”。下一秒,小东看向自己在编译器输入的代码时,才发现自己写错了代码。虽然代码是一个bug,但编译器还是像若无其事样“跑”了起来。由此我们可以推断出:代码虽然执行了起来,但执行的效果不符合程序员理想的语句叫作“语义错误”。

区分语法错误与语义错误:

小明的编程语言在经历了几个月的风风雨雨后,终于可以在这个语言使用变量和运算符了。小东想要使用这个编程语言的新特性来干点有意义的事(这个编程语言的变量与操作符与大多数编程语言无异,所以读者不必担心学习到没有用的知识),他想要写个小程序如下(看不懂以下代码的读者请不必担心,我们会在代码旁做注释,注释以“#”开头):

​
​
num1 = 10;  #我们创建了一个变量叫"num1",我们使用"="(赋值操作符)来给"num1"赋值,它的值是10
num2 = num1 * num1; #再创建一个变量"num2",将"num1"乘"num1"的值赋给这个变量
num3 = num2 * num2; #在创建一个变量"num3",重复一遍上面的操作print "num1这个变量的值是{nun},它的二次方是{num2},其次它的三次方是{num3}";
#使用"print"这个函数,"{}"是字符串插值,它可以把"{}"内的变量输出一遍​​

输出结果:num1这个变量的值是10,它的二次方是100,其次它的三次方是10000

我们来看看这个输出结果,很明显是不对的,”num1“这个变量的值是10,但它的三次方和我们预想中的结果不一致。10的三次方明明就是1000,这说明小东又写出了一个bug,我们在上文中已经讲过了语法错误与语义错误,想必大家已经知道是什么错误了吧。如果我们来帮助小东来修改应如何修改呢?下面是小东的代码修改之后的样子:

​num1 = 10;  #我们创建了一个变量叫"num1",我们使用"="(赋值操作符)来给"num1"赋值,它的值是10
num2 = num1 * num1; #再创建一个变量"num2",将"num1"乘"num1"的值赋给这个变量
num3 = num1 * num1 * num1 #在创建一个变量"num3",它是"num1"的三次方print "num1这个变量的值是{nun},它的二次方是{num2},其次它的三次方是{num3}";
#使用"print"这个函数,"{}"是字符串插值,它可以把"{}"内的变量输出一遍​

可惜这次的效果更糟,没有输出结果,取而代之的是编译器上冷冰冰的错误提示,它提示小东检查每一条语句是否加上";"这个语句结束符,如果是这一类型的错误又是什么错误呢?我们不难发现小东的第六行代码没有加上语句结束符";".。只要加上";",整个程序就可以正常运行了。

加上";"后输出的结果:

输出结果:num1这个变量的值是10,它的二次方是100,其次它的三次方是1000

语义错误很可怕:

大多数读者会不会认为语义错误会比语法错误亲切许多,因为语法错误不会帮你运行,语义错误虽然可以运行,但输出的结果与自己理想中的效果不一样。但在亲切的背后还有一具可怕的面具。为什么这么说呢?因为只要你写了一个语法错误,大多数编译器会带有错误提示,它可以毫不费劲地找到你所写错的部分,并让你在此基础上进行修改,你也可以毫不费劲地修改。但如果一个错误的类型是语义错误,那你可得小心,编译器的错误提示不会帮助你找到此错误,你需要化身为“人工编译器”自己慢慢去找,这也就是大多数程序员改一个小bug改到深夜的重大原因,他们不是长时间去修改一个bug,而是花长时间在找错误的路上。这也足以证明语义错误比语法错误更可怕。

希望这一篇文章可以帮助不理解语句错误和语义错误与不可以区分语法错误与语义错误的”小朋友“。

语法错误与语义错误(所有语言通用版)相关推荐

  1. C语言中的语法错误和语义错误

    语法错误 1:如果不遵循C语言的规则就会犯语法错误,它类似于英语中的语法错误. 例如(Bugs frustrate be can)这句英语 可以看出句子中的英语单词都是正确的,但是没有按照正确的顺序组 ...

  2. 语法错误和语义错误区别

                                       语法错误和语义错误区别  1.语法错误 语法错误在编程环境下,会在编译期被发现 在编程语言中,语法错误一定只在编译期时出现,编译器 ...

  3. 对比语法错误、语义错误以及运行时错误

    翻译人员: 铁锚 翻译日期: 2013年12月4日 原文链接:  Syntactic vs. Semantic vs. Runtime Errors 下面的三个例子演示了什么是语法错误.什么是语义错误 ...

  4. python语法错误概述_Python 错误和异常代码详解

    程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥 ...

  5. c语言中的语义错误和语法错误,C语言程序中对错误的调试

    程序调试 现在我们已经可以编写一个简单的 C语言程序了,但是你可能会犯一些简单的错误.程序的错误通常叫做 bug,而发现和修正这些错误的过程叫做调试.下面有一个带有一些错误的程序,看看你能找出多少. ...

  6. c语言出现了语法错误能编译吗,如何调试C程序的语法错误和逻辑错误

    如何调试C程序的语法错误和逻辑错误 语法错误] 语法错误,这是C语言初学者出现最多的错误,比如,分号":"是每个C语句的结束的标志,在C语句后忘记写":"就是语 ...

  7. 如何定位逻辑错误C语言,如何调试C程序的语法错误和逻辑错误

    如何调试C程序的语法错误和逻辑错误 语法错误] 语法错误,这是C语言初学者出现最多的错误,比如,分号":"是每个C语句的结束的标志,在C语句后忘记写":"就是语 ...

  8. c语言程序设计的一般错误的是,《C语言程序设计》第十章 程序常见错误分析.pdf...

    第十章 程序常见错误分析 第十章 程序常见错误分析 C 语言是一种方便灵活.功能性很强的程序设计语言,但是对于初学者很难掌 握,尤其是出了错还不知道错误在哪儿,这是由于 c 编译程序对语法的检查不如其 ...

  9. C++语言99个常见编程错误 常见错误7:无视基础语言的精妙之处

    常见错误7:无视基础语言的精妙之处   大多数C++软件工程师都自信满满地认为iziji对所谓C++的"基础语言",也就是C++继承 自C语言那部分了如指掌. 实际情况是,即使经验 ...

最新文章

  1. 拿到淘宝offer后的胡思乱想plus面试总结
  2. MIT造了个“小盒子”,可以无线监测新冠患者症状,斯隆奖获得者班底打造
  3. C++中的逻辑操作符重载
  4. 太热了,谈机房空调散散热
  5. stocker模块量化交易分析
  6. Qt添加对Android的OpenSSL支持
  7. #012python实验课
  8. Quartus 使用tcl分配管脚
  9. CSS基础(part13)--浮动
  10. 前端学习(1264):fetch响应结果
  11. ThinkPhp知识大全(非常详细)
  12. 计算机科学技术主业人才培养模式,计算机科学和技术专业人才培养模式改革和创新.doc...
  13. 火狐marquee_火狐不支持marquee解决方案
  14. python中stacked_栈式自动编码器(Stacked AutoEncoder)
  15. 老式计算机如何设置u盘启动,旧主板bios界面设置U盘启动教程
  16. cmd命令卸载sql server_Sql server 卸载方法
  17. python往npy写入数据_数据存储在*.npy中的方式是什么?
  18. 基于SpringBoot + Vue的个人博客系统12——使用vue-admin-template展示文章列表(后台管理)
  19. 三张表,四张表怎么连接?
  20. MS SQL存储过程

热门文章

  1. 查看linux snmp状态,Linux开启snmp及查询
  2. VScode remote development 远程开发
  3. 三、nginx服务的nginx.conf的参数配置解析
  4. 王子与骑士-第14届蓝桥杯STEMA测评Scratch真题精选
  5. 企业电销如何获得高质量精准流量,大数据获客直击精准客流
  6. WF(Workflow foundation)与Asp.net结合(二)
  7. 中国数字地球行业发展态势与投资前景展望报告(新版)2022-2027年
  8. 华为2019秋招面试问答题!(附带笔试参考题)
  9. 炉石一直显示连接服务器,炉石传说无法连接战网服务器怎么办 处理方法详解...
  10. VuePress自动化部署到GitHub服务器