《C陷阱与缺陷》第一章心得与笔记

本文深入探讨C语言中常见的陷阱与缺陷,包括等号与比较运算符的混淆、按位与逻辑运算符的区别、词法分析的贪心法则、整型与字符常量的误解。通过具体示例解析这些陷阱如何导致程序错误,以及如何避免。

《C陷阱与缺陷》第一章心得与笔记 词法陷阱

1.1 =和==

‘=’是赋值运算符;’=='是比较运算符。
eg1:

if (x = y)

本例本想判断x与y是否相等,写成x = y后,if的条件就变成了先将y赋值给x,再判断x的值是否为0。
eg2:

while(c = ' ' || c == '\t' || c == '\n')
{
	c = getc(f);
}

本例中循环语句上的本意是跳过文件中的空格符、制表符、和换行符,本想写成c == ‘ ’,结果误写成了c = ’ ‘。由于赋值运算符’=‘的优先级要比逻辑运算符’||‘低,所以,实际上是将一下表达式的值赋值给了c = ’ ’ || c == ‘\t’ || c == ‘\n’,因为 ‘ ’不等于0,(’ '的ASCII码值为32),所以while循环会一直运行,知道文件读取结束。文件读取结束之后循环是否继续,取决于getc库函数的具体实现。
eg3:

if ((filedesc == open(argc[i], 0)) < 0)
	error();

在本例中,如果open函数执行成功,将返回0或者正数,如果执行失败,则返回-1。上面的代码本意是将open函数的返回值赋值给filedesc,然后判断filedesc是否小于0。将’=‘误写成’‘之后,则变成了先判断filedesc的值与open函数的返回值是否相等,再判断是否小于0,由于’'的结果只有0或者1,永远不可能小于0,则if的条件恒为1。有些编译器会提示相应的警告。

1.2 & 和 | 不同于 && 和 ||

&:按位与
|:按位或
&&:逻辑与
||:逻辑或

1.3 词法分析中的“贪心法”

C语言编译器判断由多个字符组成的符号的规则:每一个符号应该尽可能的包含更多的字符。

编译器将程序分解成符号的方法是:从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符串组成的字符串已不再可能组成一个有意义的符号。这个处理过程被称为“贪心法”。

需要注意的是,除了字符串和字符常量,符号的中间不能嵌有空白(空格符、制表符和换行符)。

1.4 整型常量

如果一个整形常量的第一个字符是数字0,那么该常量将被视作八进制数。

1.5 字符与字符串

用单引号引起的一个字符实际上代表一个整数,整数值对应该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a’的含义与0141(八进制)或者97(十进制)严格一致。

用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为0的字符’\0’初始化。
eg1:

下面语句

printf("Hello world\n");

char hello[] = {'H', 'e', 'l', 'l', 'o', ' ',
			    'w', 'o', 'r', 'l', 'd', '\n', 0};
printf(hello);

是等效的。

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于CC++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别长度信息;地址字段明确目标设备所处的网络位置节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值