0
 if (_1_HOUR < count_value < _2_HOUR) {...}

此代码片段在 MPLAB X 中生成警告(它显然是使用 XC16 编译器编译的)。但我觉得它应该是一个错误。正确的代码(恕我直言)是:

 if ((count_value >_1_HOUR) && (count_value < _2_HOUR)) {...}

我正在寻找涵盖这一点的 C 编程规则 - 有人知道那是什么吗?谢谢。

4

2 回答 2

4

寻找涵盖这一点的 C 编程规则 - 有人知道那是什么吗?

既然你问了,在语法上涵盖这一点的 C 2018 规则是:

  • 6.5.8 说 a relational-expressionmay be 。relational-expression < shift-expression
  • 将其代入其第一个操作数,relational-expression可能是.relational-expression < relational-expession < shift-expression
  • 6.5.8 还说a relational-expressionmay be shift-expression。所以我们可以把它代入上面两次得到.shift-expression < shift-expession < shift-expression
  • 6.5.7 说 a shift-expressionmay be additive-expression
  • 6.5.6 说一个additive-expression可能是multiplicative-expression
  • 6.5.5 说 a multiplicative-expressionmay be cast-expression
  • 6.5.4 说 a cast-expressionmay be unary-expression
  • 6.5.3 说 a unary-expressionmay be postfix-expression
  • 6.5.2 说 a postfix-expressionmay be primary-expression
  • 6.5.1 说 a primary-expressionmay be identifieror constant.
  • 因此, a relational-expressionmay be ,它可以是(或者,如果其中任何一个是扩展为常量或其他表达式的宏,则适用类似规则)。identifier < identifier < identifier_1_HOUR < count_value < _2_HOUR

在语义上涵盖这一点的规则是:

  • 6.5.8 3 表示两个操作数<都应具有实数类型(整数或浮点数)或两者都应是指针(有某些限制)。大概两者都有_1_HOURcountvalue有整数或浮点类型,满足前者。
  • 6.5.8 6 表示“……结果类型为int。” 因此,当第二个的操作数<_1_HOUR < countvalueand _2_HOUR(也可能是整数或浮点数)时,它们也满足 6.5.8 3。
于 2021-09-23T21:11:10.820 回答
2

我觉得这应该是一个错误

好吧,事实并非如此。该代码完全有效并且具有定义的行为。

if (_1_HOUR < count_value < _2_HOUR) {...}

如果1_HOUR < count_value(which is 0or 1in 算术上下文)的结果小于_2_HOURthen{...}

您的 X16 编译器可能支持这些可以帮助您的选项:
-Wall -Wextra -Werror -pedantic

我不确定它是否也支持-pedantic-errors. 医生有点模糊。

`

于 2021-09-23T20:52:23.800 回答