【问题标题】:is it defined behaviour to add the result of logical operation添加逻辑运算的结果是否定义了行为
【发布时间】:2017-08-14 15:54:30
【问题描述】:

是否可以(定义的行为)将逻辑运算的结果相加(因为它们应该只是 0 或 1)?

如果我想计算大于零的数字,我可以这样做吗?(或者有更好的方法吗?)

int a[3] = {1,-5,3};
int result  = 0;
for( int i = 0 ; i<3; i++)
{
    result += a[i]>0;
}

【问题讨论】:

  • a[i]&gt;0 是 0 或 1。是的,它已定义。
  • 是的,这是非常好的代码。所有布尔运算(例如关系运算符)都保证返回值为 1 或 0 的 int。

标签: c relational-operators


【解决方案1】:

引用C11,第 6.5.8 章,(强调我的)

每个运算符&lt;(小于)、&gt;(大于)、&lt;=(小于或等于)和&gt;= (大于或等于)如果指定关系为真,则应产生1,如果是,则应产生0 false。107) 结果的类型为int。

然后你正在执行一个复合赋值,它需要

仅对于运算符+= 和-=,左操作数应为原子的、合格的或 指向完整对象类型的非限定指针,并且正确的应该是整数类型;或 左操作数应具有原子的、合格的或不合格的算术类型,而右 应该有算术类型。

并且你的表达式满足约束。

所以是的,这是定义的行为。


也就是说,从语法的角度来看,您只是安全的,因为默认的 operator precedence 符合您的期望。这样没有问题,但明确(因此,当然)永远不会受到伤害。

你可以将表达式改写为

 result += ( a[i] > 0 );

【讨论】:

  • 您知道在哪里可以找到头顶上的标准相关部分吗?或者你怎么能这么快?^^
  • @KamiKaze 所有操作员组都在第 6.5 章中列出,因此只需打开 pdf 并单击相关组:)
  • @Lundin 我想我会放弃我想读的下一本书,而是阅读完整的标准。这样我就知道在哪里可以找到什么
  • @StoryTeller:修正了双重否定:-)。
  • @KamiKaze - 如果您想快速学习,该标准对于学习语言来说是一个非常糟糕的资源。你最好先读完这本书,然后按标准毕业。
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多