编译原理中讲到程序构造的一般过程是:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。词法分析对应的就是C语言中的“单词”(也称“符号”),指的是程序的一个基本组成单元,每个符号都有自己固定的字符序列,但是同一个字符序列可能属于不同的符号。

例如:字符序列“->”,有可能代表的是->运算符,也有可能代表字符串“->”,这就需要根据上下文环境判断。

1、C语言中符号之间的空白(空格、制表符或换行符)都被忽略

if(1

if

(

1

<

x

)

这两条语句是等效的,注意这里指的是“符号之间”的空白,不是“符号之内”,如果把“if”写成“i f”是不行的,"if"在C语言内部是一个固定的符号,是可以识别的有效“单词”,而“i f”却不是,可以拿英文句子来类比分析。“I am the best!”是一个有效语句,是因为在词法分析时各个单词都是有效单词;如果写成“I    am  the       best!”,仍然有效;但是“I am the b est !”无效,因为“b est”在系统库中无法找到匹配的单词,道理相同。

2、C语言中符号之内不能有空白(空格、制表符或换行符)

编译器区分各个符号的终极原则就是“空白”(还有其他原则,例如贪心法),如果符号之内有空白,编译器只能(也是必须)把它们解释成“两个或多个符号”,如果没有空白,也可能解释成多个符号,这时贪心法在起作用。例如:++是一个“自增运算符”,+ + 就是两个“加法运算符”,+++虽然没有空白,也只能解释成“自增运算符+加法运算符”,因为贪心法在作怪。

3、“符号之间”和“符号之内”的讨论,有什么用处?

我们编写程序,首先是给人读懂,其次是给计算机(也可认为编译器)读懂,两者缺一不可。如果“人”和“计算机”对同一个事物的理解出现偏差,那运行结果就不可预料了,而今天的讨论就是为了让我们更加“懂计算机”,理解“计算机”的思维方式,在“人”读懂的基础上,让“计算机”也能读懂,甚至必要时以“计算机”读懂为根本方针。

词法分析中的“贪心法”:编译器在对符号进行分解时,必须对某个“连续字符串”进行顺序分析(不连续的字符串,肯定不属于同一个“符号”,直接截断并对每个片段单独用贪心法分析),确定由几个符号(单词)组成。确定符号的过程中,编译器假设每个符号包含尽可能多的字符(字母),即:从字符偏移0开始依次读取字符串,如果加上下一个字符还能组成一个有效的符号就加上它,持续添加直到加上某个字符后,就不再是一个有效符号了,那么这个字符前面的从偏移0开始的字符串,就是一个有效的“符号”;继续修改偏移0到这个字符,持续上述过程知道本行结束。

理解了“贪心法”,我们在程序书写上就应该尽量照顾计算机的思想,而不是随便写一通。例如:

result = num/*p;

对这行代码,计算机用贪心法分析符号有6个“result、=、num、/*、p、;”,而我们的理解是“result 、=、num、/、*p、;”。本来想写一个除法表达式,num除以指针p指向的内容,可是计算机理解成了“result = num”剩下的是注释,显然不是我们想要的。如何切断贪心法对"/*"的连接呢?根据上面的讨论,我们用“空格”,写出这样:

result = num/ *p;

当增加一个空格后,贪心法再次分析到“/”的时候,由于后边紧跟空格不再是连续字符串,所以无条件截断,这样就可以防止上面的情况发生。还可以用括号进行显式指定:

result = num / (*p) ;

这一次既对代码进行了手动空格分割,便于计算机理解,又添加了括号,增加了代码的可读性。真正高质量的代码就是这样,计算机阅读没有二义性,人阅读也没有二义性。所以代码中,要善于利用空格和括号,提高规范性提升代码质量,防止歧义发生。

c语言字符-1代表什么,玩儿转C语言:符号和字符(1)相关推荐

  1. c语言double可以代表整型么,C语言中整型变量(int)实型变量(float)双精度变量(double)到底是什么东西?有什么区...

    整型[signed]int -2147483648~+2147483648 无符号整型unsigned[int] 0~4294967295 短整型 short [int] -32768~32768 无 ...

  2. 经典例题:编写一个程序,从键盘输入一串字符,统计这串字符中英文字母、数字、其他字符号的字符数。

    思路 既然要键盘输入,那么可以通过Scanner类来实现,首先定义四个变量分别记录下字母个数的变量.数字个数.其他字符和空格个数.因为要操作字符串,可以把字符串String类型转换成char字节数组类 ...

  3. c语言单字符输入和输出函数分别为,c语言第六章字符数据

    <c语言第六章字符数据>由会员分享,可在线阅读,更多相关<c语言第六章字符数据(18页珍藏版)>请在人人文库网上搜索. 1.第6章字符数据,6.1字符常数,6.2字符变量,6. ...

  4. c语言程序 t代表什么意思,t表示什么(男生0和t是什么意思)

    在物理中,"T"表示什么意思? 特斯拉(物理单位),特斯拉英文为tesla(字首小写),符号表示为T,是磁通量密度或磁感应强度的国际单位制导出单位.物理量名称:热力学温度,物理量符 ...

  5. 字符串匹配的KMP算法和C语言代码,不需要思考就能理解

    KMP算法用于判断一个字符串是否包含另一个字符串,如果包含就返回脚标.其实KMP算法本身特别简单,我看了几篇本章都号称简单易懂,结果看得我云里雾里,直到我看到了阮一峰:字符串匹配的KMP算法,才真正看 ...

  6. C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中)

    C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中) 需要引入C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 测试(确实只能读n-1个 ...

  7. Java黑皮书课后题第4章:*4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1、2、3、4,输出对应结果

    *4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1.2.3.4,分别表示大一.大二.大三.大四 题目 题目概 ...

  8. Java黑皮书课后题第4章:*4.10(猜测生日)改写程序清单4-3,提示用户输入字符Y代表“是”N代表“否”,代替之前输入1表示“是”,0表示“否

    *4.10(猜测生日)改写程序清单4-3,提示用户输入字符Y代表"是"N代表"否",代替之前输入1表示"是",0表示"否 题目 题 ...

  9. C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。

    1. 题目 编写函数function,该函数的功能是:从字符中删除指定的字符,同一字母的大.小写按不同字符处理. 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科 ...

最新文章

  1. 多喜临门,BCH币价应声上涨
  2. 【深度学习】生动分析半监督学习与负相关学习算法
  3. 跟面试官聊到JVM,他99%会让你谈谈这个问题!
  4. 判断网络是否为真正的公网IP
  5. android WIFI信息获取
  6. 怎样检查计算机的网络配置,如何检查计算机内存和配置?(3种方法教你检查计算机的真实配置)...
  7. 课程 预编译框架,开发高性能应用 - 微软技术暨生态大会 2018
  8. 【APICloud系列|24】 MNNavigationMenu模块(导航菜单)的实现
  9. Bulk异常引发的Elasticsearch内存泄漏
  10. Go 触发 GC 的时机有哪些?能手动触发吗?
  11. LeetCode2. 两数相加
  12. 动态生成圈形+文字的图片
  13. Linux 命令(20)—— cat 命令
  14. 操作系统COM组件的概念
  15. iis 无法启动计算机,win10系统iis无法启动的详细步骤
  16. wso2 esb 配置mysql_wso2esb安装及helloworld
  17. win10无线网卡启动服务器,win10系统无线网卡被禁用怎么办?win10开启无线网卡的方法...
  18. Audience Targeting
  19. 模块手机Project Ara的MDK(Module Developers Kit)模块开发套件
  20. 通配符的匹配很全面, 但无法找到元素 ‘aop:aspectj-autoproxy‘ 的声明

热门文章

  1. 【程序员觉醒】提高效率,增加输出
  2. 3月14日 | ICLR 2023预讲会深度学习领域顶会专场一
  3. 钢4基础设施超过上限导致基建需求变负
  4. DockerHub使用及跨平台下载Arm架构的镜像
  5. 喜欢玩游戏的发烧友不要错过了,五款高续航低延迟蓝牙耳机为你量身打造
  6. 【小程序源码】llz制作生成装逼工具支持小程序和公众号制作生成
  7. 微信支付---二维码的生成(保姆级介绍)
  8. 网上共享核磁数据文件批量复制和解压,并删除压缩文件
  9. 超详细 java二维数组解析
  10. 安卓 页面跳转_曲奇影视:支持安卓+苹果,新出来的双端手机看片神器。