1 / 12
文档名称:

软件编程低级错误表达式PPT学习教案.pptx

格式:pptx   大小:103KB   页数:12页
下载后只包含 1 个 PPTX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

软件编程低级错误表达式PPT学习教案.pptx

上传人:wz_198613 2021/6/4 文件大小:103 KB

下载得到文件列表

软件编程低级错误表达式PPT学习教案.pptx

相关文档

文档介绍

文档介绍:会计学
1
软件编程低级错误表达式
前言
这套材料作为编程规范的辅助材料,帮助大家理解编程规范背后的原理。
C和C++语言是我司的主流编程语言,然而C/C++具有很多强大的语言特性,从而导致C/C++非常复杂,使得代码更容易出现BUG、难以阅读和维护。
业界知名的编程规范都对C/C++容易出现问题的语言特性进行管理。例如MISRA(汽车工业软件可靠性联合会)制定的1998版的MISRAC规范指出,一些在C看来可以接受,却存在隐患的地方有127处之多。2004版的MISRAC规范将针对C语言的规则增加到了141条。
对于程序员来说,能工作的代码并不等于“好” 代码。“好”代码的指标很多,包括可读性、可维护性、可移植性和可靠性等。出现网上问题的代码,大多数是不良编程****惯引起的。不遵守编程规范的代码,往往也是最不可靠的代码。
本胶片收集了常见的表达式案例,给出了相应的纠正措施。对应的编程规范:表达式的值在标准所允许的任何运算次序下都应该是相同的;用括号明确表达式的操作顺序,避免过分依赖默认优先级
第1页/共12页
表达式使用默认优先级:规则
【规则】ISO 9899::
1. 一元运算符,不需要使用括号
x = ~a; /* 一元运算符,不需要括号 */
x = -a; /* 一元运算符,不需要括号 */
2. 二元以上运算符,如果涉及多种运算符,则应该使用括号
x = a + b + c; /* 运算符相同,不需要括号 */
x = f ( a + b, c ) /* 运算符相同,不需要括号 */
if (a && b && c) /* 运算符相同,不需要括号 */
x = (a * 3) + c + d; /* 运算符不同,需要括号 */
x = ( a == b ) ? a : ( a – b ); /* 运算符不同,需要括号 */
3 .即使所有运算符都是相同的,如果涉及类型转换或者量级提升,也应该使用括号控制计算的次序
以下代码将3个浮点数相加:
f4 = f1 + f2 + f3; /* 除了逗号(,),逻辑与(&&),逻辑或(||)之外,C标准没有规定同级运算符是从左还是从右开始计算,以上表达式存在2种计算次序:f4 = (f1 + f2) + f3 或 f4 = f1 + (f2 + f3),浮点数计算过程中可能四舍五入,量级提升,计算次序的不同会导致f4的结果不同,以上表达式在不同编译器上的计算结果可能不一样,建议增加括号明确计算顺序 */
第2页/共12页
表达式使用默认优先级(1)
【问题描述】同一个目录下发布多个频道到一定值后,虽然是计费频道,但实际访问时并没有付费定购提示,好像变成了免费模式
【问题定位】问题代码如下:
String curDirPosition = (longCurDirPosition % 100 > 9) ? "" : "0"
+ longCurDirPosition % 100;
程序的本意是根据longCurDirPosition % 100 > 9的值,输出” longCurDirPosition % 100”或者””0” + longCurDirPosition % 100”。在换行符的作用下很容易让人以为程序是没有问题的,但实际上程序执行的优先级与作者的期望不符,以上语句等价与:
String curDirPosition = (longCurDirPosition % 100 > 9) ? "" : ( "0"
+ longCurDirPosition % 100 );
结果将输出””或者”’0’ + longCurDirPosition % 100”
【纠正措施】补充一对括号,修改代码为:
String curDirPosition = ( (longCurDirPosition % 100 > 9) ? "" : "0“ )
+ longCurDirPosition % 100;
第3页/共12页
表达式使用默认优先级(2)
【问题描述】对密码进行MD5加密的时候,得出来的结果每次都是空。
【问题定位】如下代码:
ucPwdLen = ucPwdLen&0xf0 + 0x10;
程序执行的实际优先级为:
ucPwdLen = ucPwdLen& (0xf0 + 0x10) ;
【纠正措施】补充一对括号,修改代码为:
ucPwdLen = (ucPwdLen&0xf0) + 0x10 ;
第4页/共12页
表达式使用默认优先级(3)
【问题描述】香港鉴权二次重同步出现SQN混乱。
【问题定位】如下代码:
if (( + 1)