XC16编译器链式比较仅报警告未判错误,对应C语言规则查询
C语言链式比较的规则与XC16编译行为说明
一、C语言官方规则说明
C标准(ISO/IEC 9899全版本)对这类链式比较表达式的判定基于运算符的结合性与返回值规则:
- 关系运算符
<>等为左结合属性,因此表达式_1_HOUR < count_value < _2_HOUR会被编译器自动解析为(_1_HOUR < count_value) < _2_HOUR - 关系运算的返回值为
int类型:条件成立返回1,不成立返回0
你写的链式比较实际执行逻辑为:先判断_1_HOUR是否小于count_value,得到0或1的布尔结果,再拿这个0/1去和_2_HOUR比较。只要_2_HOUR的定义值大于1,不管count_value实际是多少,整个表达式最终结果永远为真,完全不符合判断count_value落在两个常量区间的预期,也就是你发现的逻辑错误。但要注意:这种写法语法完全符合C标准要求,不属于语法错误,仅逻辑和用户预期不符。
二、XC16仅输出警告不报错的原因
- C标准仅要求编译器对不符合语法规则的代码输出错误、终止编译;对于语法合法、但大概率是用户逻辑写错的代码,仅允许编译器输出可选的诊断提示,没有强制要求报错
- XC16编译器的前端基于GCC实现,会识别到这类几乎肯定不符合用户预期的链式比较写法,输出对应的警告提示,但因为语法本身合法,默认不会作为错误处理
如果你希望编译器把这类问题判定为错误,可以在编译选项中添加-Werror将所有警告转为错误,也可以使用更精准的-Werror=parentheses仅将这类括号缺失导致的高风险警告转为错误。
正确写法说明
你给出的拆分后用逻辑与连接的写法完全符合预期:
if ((count_value > _1_HOUR) && (count_value < _2_HOUR)) {...}
这种写法明确告知编译器要分别判断两个关系表达式的结果,再做逻辑与运算,符合区间判断的逻辑需求。
内容的提问来源于stack exchange,提问作者Mudge
相关产品推荐
相关产品推荐

