c语言字符-1代表什么,玩儿转C语言:符号和字符(1)
编译原理中讲到程序构造的一般过程是:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。词法分析对应的就是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)相关推荐
- c语言double可以代表整型么,C语言中整型变量(int)实型变量(float)双精度变量(double)到底是什么东西?有什么区...
整型[signed]int -2147483648~+2147483648 无符号整型unsigned[int] 0~4294967295 短整型 short [int] -32768~32768 无 ...
- 经典例题:编写一个程序,从键盘输入一串字符,统计这串字符中英文字母、数字、其他字符号的字符数。
思路 既然要键盘输入,那么可以通过Scanner类来实现,首先定义四个变量分别记录下字母个数的变量.数字个数.其他字符和空格个数.因为要操作字符串,可以把字符串String类型转换成char字节数组类 ...
- c语言单字符输入和输出函数分别为,c语言第六章字符数据
<c语言第六章字符数据>由会员分享,可在线阅读,更多相关<c语言第六章字符数据(18页珍藏版)>请在人人文库网上搜索. 1.第6章字符数据,6.1字符常数,6.2字符变量,6. ...
- c语言程序 t代表什么意思,t表示什么(男生0和t是什么意思)
在物理中,"T"表示什么意思? 特斯拉(物理单位),特斯拉英文为tesla(字首小写),符号表示为T,是磁通量密度或磁感应强度的国际单位制导出单位.物理量名称:热力学温度,物理量符 ...
- 字符串匹配的KMP算法和C语言代码,不需要思考就能理解
KMP算法用于判断一个字符串是否包含另一个字符串,如果包含就返回脚标.其实KMP算法本身特别简单,我看了几篇本章都号称简单易懂,结果看得我云里雾里,直到我看到了阮一峰:字符串匹配的KMP算法,才真正看 ...
- C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中)
C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中) 需要引入C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 测试(确实只能读n-1个 ...
- Java黑皮书课后题第4章:*4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1、2、3、4,输出对应结果
*4.18(学生的专业和年级)编程一个程序,提示用户输入两个字符,显示这两个字符代表的专业以及年级,第一个字符表示专业,第二个是一个数字字符1.2.3.4,分别表示大一.大二.大三.大四 题目 题目概 ...
- Java黑皮书课后题第4章:*4.10(猜测生日)改写程序清单4-3,提示用户输入字符Y代表“是”N代表“否”,代替之前输入1表示“是”,0表示“否
*4.10(猜测生日)改写程序清单4-3,提示用户输入字符Y代表"是"N代表"否",代替之前输入1表示"是",0表示"否 题目 题 ...
- C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。
1. 题目 编写函数function,该函数的功能是:从字符中删除指定的字符,同一字母的大.小写按不同字符处理. 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科 ...
最新文章
- 多喜临门,BCH币价应声上涨
- 【深度学习】生动分析半监督学习与负相关学习算法
- 跟面试官聊到JVM,他99%会让你谈谈这个问题!
- 判断网络是否为真正的公网IP
- android WIFI信息获取
- 怎样检查计算机的网络配置,如何检查计算机内存和配置?(3种方法教你检查计算机的真实配置)...
- 课程 预编译框架,开发高性能应用 - 微软技术暨生态大会 2018
- 【APICloud系列|24】 MNNavigationMenu模块(导航菜单)的实现
- Bulk异常引发的Elasticsearch内存泄漏
- Go 触发 GC 的时机有哪些?能手动触发吗?
- LeetCode2. 两数相加
- 动态生成圈形+文字的图片
- Linux 命令(20)—— cat 命令
- 操作系统COM组件的概念
- iis 无法启动计算机,win10系统iis无法启动的详细步骤
- wso2 esb 配置mysql_wso2esb安装及helloworld
- win10无线网卡启动服务器,win10系统无线网卡被禁用怎么办?win10开启无线网卡的方法...
- Audience Targeting
- 模块手机Project Ara的MDK(Module Developers Kit)模块开发套件
- 通配符的匹配很全面, 但无法找到元素 ‘aop:aspectj-autoproxy‘ 的声明