c语言中关于值比较时需要注意的事项

c语言中关于值比较时需要注意的事项

tags: c 随笔


今天调试时,遇到一个问题,虽然非常非常简单也非常非常好排查,以至于以前都没有太在意这个问题。简要记录一下。

代码:

int recvLen = recvfrom(……);//recvfrom()为windows socket接收的API
if (recvLen > sizeof(SOCKET_MSG_HEAD)) {
    ……
}

这里面其实是有问题,由于一般自己写这种类似recvfrom,然后返回接收长度的函数在定义的时候都会刻意的把函数返回值定义为unsigned int类型,而recvfrom()的返回值微软定义的是一个有符号类型。

所以说当recvfrom返回-1的时候,recvLen就是大于sizeof(SOCKET_MSG_HEAD)的,因为sizeof()被认为是一个无符号整数,而有符号和无符号整数在比较时,编译器会把有符号数的符号忽略掉,直接拿内存里面存的实际值来比较,所以-1就是0xFFFFFFFF,所以就出现了上述问题。

总结下来:
1、有符号数和无符号数比较时,汇编代码被编译成无符号比较:

00402a26:   mov     -0x20(%ebp),%eax
00402a29:   cmp     -0x1c(%ebp),%eax
00402a2c:   jbe     0x4029da <SocketServerProc+272>

这样的比较在实际中应该避免或者禁止
2、sizeof()的结果编译器认为是无符号数。

《编译原理》是计算机科学中一门极为重要的课程,主要探讨如何将高级程序设计语言转换成机器可执行的指令。清华大学的张素琴教授在这一领域有着深厚的学术造诣,其编译原理课后习题答案对于学习者而言是非常珍贵的资源。这份压缩文件详细解析了课程中所涉及的概念、理论和方法的实践应用,目的是帮助学生更好地理解编译器设计的核心内容。 编译原理的核心知识点主要包括以下几点: 词法分析:作为编译过程的首要环节,词法分析器会扫描源代码,识别出一个个称为“标记”(Token)的最小语法单位。通常借助正则表达式来定义各种标记的模式。 语法分析:基于词法分析产生的标记流,语法分析器依据文法规则构建语法树。上下文无关文法(CFG)是编译器设计中常用的一种形式化工具。 语义分析:这一步骤用于理解程序的意义,确保程序符合语言的语义规则。语义分析可分为静态语义分析和动态语义分析,前者主要检查类型匹配、变量声明等内容,后者则关注运行的行为。 中间代码生成:编译器通常会生成一种高级的中间表示,如三地址码或抽象语法树,以便于后续的优化和目标代码生成。 代码优化:通过消除冗余计算、改进数据布局等方式提升程序的执行效率,同不改变程序的语义。 目标代码生成:根据中间代码生成特定机器架构的目标代码,这一阶段需要考虑指令集体系结构、寄存器分配、跳转优化等问题。 链接:将编译后的模块进行合并,解决外部引用,最终形成一个可执行文件。 错误处理:在词法分析、语法分析和语义分析过程中,编译器需要能够检测并报告错误,例如语法错误、类型错误等。 张素琴教授的课后习题答案覆盖了上述所有核心知识点,并可能包含实际编程练习,比如实现简单的编译器或解释器,以及针对特定问题的解题策略。通过解答这些习题,学生可以加深对编译原理的理解,提升解决问题的能力,为今后参与编译器开发或软件工程实践奠定坚实的基础。这份资源不仅是学习编译原理的有力辅助材料,也是
在C语言中,指针是一种非常重要的数据类型,它可以用来存储内存地址,并且可以通过间接引用符号 "*" 来访问该内存地址中存储的。在使用指针需要特别注意以下几点: 1. 初始化指针:在使用指针之前必须先初始化指针变量,否则会出现未知的结果。初始化指针可以将指针变量初始化为NULL或者是一个有效的内存地址。 2. 指针的类型:指针变量必须与指向的数据类型匹配。例如,如果指针变量指向一个整型变量,则应该使用 int *p; 而不是 char *p; 。 3. 指针的地址:指针变量本身也有一个地址,可以通过使用取地址符号 "&" 来获取指针变量的地址。例如, &p 将返回指针变量 p 的地址。 4. 指针的间接引用:指针变量存储的是内存地址,可以通过间接引用符号 "*" 来访问该内存地址中存储的。例如, *p 将返回指针变量 p 所指向的内存地址中存储的。 5. 指针的运算:指针变量可以进行算术运算,例如加法和减法。这些运算将根据指针所指向的数据类型来调整指针变量的。 6. 指针的释放:在使用完指针后,必须释放指针变量所指向的内存空间,否则会出现内存泄漏的问题。可以使用 free() 函数来释放指针变量所指向的内存空间。 总之,使用指针是C语言编程中非常重要的一部分,需要注意以上几点才能正确地使用指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值