论文部分内容阅读
[摘 要]C语言的运算符和优先级顺序非常重要,当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。本文就某型号图像识别软件中出现运算符优先级处理不当问题做机理分析和问题总结,并阐述纠正措施。
[关键词]运算 优先级 结合性
中图分类号:TP957 文献标识码:A 文章编号:1009-914X(2018)38-0256-02
1. C语言
C语言是常用的一种编程语言,C语言的运算符和优先级顺序非常重要,在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象,不同的运算顺序可能得出不同结果甚至出现运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性,如果使用不合理,就很容易造成计算错误等问题。
2. 运算符优先级
C语言运算符共有15级优先级,每一级的结合性,不是从左到右就是从右到左。表达式中,在没有括号的情况下,这些规则决定了表达式运算的次序,每一级中的运算符是同优先级的。下表对操作符的优先级和结合性作了小结。
3.案例现象
接下来让我们结合实例来说明运算符优先级的重要性。
该软件是某型号图像识别软件,作为分系统中重要的测量部件,其软、硬件相互紧密配合,协同工作,以满足分系统对目标姿态捕获要求。该软件主体采用ANSI C语言,嵌入少量DSP汇编语言,程序中规定在完成星图的初始捕获后,软件应能利用已知的姿态,跟踪视场中已识别出的恒星在视场内的移动,具体做法是:为每一颗已识别出的恒星设定确定的跟踪波门,每次仅在波门内提取星点,随着目标的运动,进行跟踪状态下的重新识别。该软件在测试中发现在星跟踪阶段,识别星丢失的问题现象。
4.機理分析
根据型号对于软件的动态要求以及软件本身的图像传感器信息计算后,以已知的星点坐标为中心以半径20的波门对星点进行跟踪扫描,并利用已知星点信息进行验证,求出区域内星的数量,每个区域至多取9颗星,程序代码如下:
当求出区域内星的数量tmpLctSum之后,程序会执行判断语句if(tmpLctSum&0xFF >0 ),这里设计师的本意是若提取出的星数大于0则保存提取出的星点坐标并带入之后的星跟踪计算,然而设计师却忽略了一个重要的问题-运算符的优先级!表达式中的运算符优先级见下表。
由于“>”的优先级比“&”高,0xFF>0的判断结果总为1,因此判断语句等同于if(tmpLctSum&1),当星跟踪在某一区域提取出的星点个数为偶数时不保存星点坐标,导致这些星点丢失并使这颗星跟踪失败。
5.纠正措施
查清问题并分析清楚机理后,软件设计人员采取了如下纠正措施:将判断语句if(tmpLctSum&0xFF >0 )更改为if((tmpLctSum&0xFF) >0 ),更改后的软件运行结果正确。
6.启示和建议
通过以上例子,可以得出以下启示及建议:
在软件开发、测试过程中要充分考虑运算符的优先级和组合,C语言中有很多运算符,除了四则运算,还有位运算、比较运算、逻辑运算、赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼。在含有逻辑操作符的表达式中使用括号可使运算顺序变得清晰,对于优先级不明确的最好使用括号括起。
动态测试的全面性依旧是保证测试质量的关键,测试人员要针对软件各个功能项编写正常异常用例,既要对每个条件判断使用等价类方法进行用例设计,还要考虑组合情况。
作者简介
陈琦,软件测评工程师,从事软件测评工作。
[关键词]运算 优先级 结合性
中图分类号:TP957 文献标识码:A 文章编号:1009-914X(2018)38-0256-02
1. C语言
C语言是常用的一种编程语言,C语言的运算符和优先级顺序非常重要,在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象,不同的运算顺序可能得出不同结果甚至出现运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性,如果使用不合理,就很容易造成计算错误等问题。
2. 运算符优先级
C语言运算符共有15级优先级,每一级的结合性,不是从左到右就是从右到左。表达式中,在没有括号的情况下,这些规则决定了表达式运算的次序,每一级中的运算符是同优先级的。下表对操作符的优先级和结合性作了小结。
3.案例现象
接下来让我们结合实例来说明运算符优先级的重要性。
该软件是某型号图像识别软件,作为分系统中重要的测量部件,其软、硬件相互紧密配合,协同工作,以满足分系统对目标姿态捕获要求。该软件主体采用ANSI C语言,嵌入少量DSP汇编语言,程序中规定在完成星图的初始捕获后,软件应能利用已知的姿态,跟踪视场中已识别出的恒星在视场内的移动,具体做法是:为每一颗已识别出的恒星设定确定的跟踪波门,每次仅在波门内提取星点,随着目标的运动,进行跟踪状态下的重新识别。该软件在测试中发现在星跟踪阶段,识别星丢失的问题现象。
4.機理分析
根据型号对于软件的动态要求以及软件本身的图像传感器信息计算后,以已知的星点坐标为中心以半径20的波门对星点进行跟踪扫描,并利用已知星点信息进行验证,求出区域内星的数量,每个区域至多取9颗星,程序代码如下:
当求出区域内星的数量tmpLctSum之后,程序会执行判断语句if(tmpLctSum&0xFF >0 ),这里设计师的本意是若提取出的星数大于0则保存提取出的星点坐标并带入之后的星跟踪计算,然而设计师却忽略了一个重要的问题-运算符的优先级!表达式中的运算符优先级见下表。
由于“>”的优先级比“&”高,0xFF>0的判断结果总为1,因此判断语句等同于if(tmpLctSum&1),当星跟踪在某一区域提取出的星点个数为偶数时不保存星点坐标,导致这些星点丢失并使这颗星跟踪失败。
5.纠正措施
查清问题并分析清楚机理后,软件设计人员采取了如下纠正措施:将判断语句if(tmpLctSum&0xFF >0 )更改为if((tmpLctSum&0xFF) >0 ),更改后的软件运行结果正确。
6.启示和建议
通过以上例子,可以得出以下启示及建议:
在软件开发、测试过程中要充分考虑运算符的优先级和组合,C语言中有很多运算符,除了四则运算,还有位运算、比较运算、逻辑运算、赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼。在含有逻辑操作符的表达式中使用括号可使运算顺序变得清晰,对于优先级不明确的最好使用括号括起。
动态测试的全面性依旧是保证测试质量的关键,测试人员要针对软件各个功能项编写正常异常用例,既要对每个条件判断使用等价类方法进行用例设计,还要考虑组合情况。
作者简介
陈琦,软件测评工程师,从事软件测评工作。