是否定义了添加逻辑运算结果的行为

时间:2017-03-22 13:36:59

标签: c relational-operators

是否可以(定义行为)添加逻辑运算的结果(因为它们应该只是01)?

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

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

1 个答案:

答案 0 :(得分:5)

引用C11,章节§6.5.8,(强调我的

  

每个运营商<(小于),>(大于),<=(小于或等于)和>=   (大于或等于)如果指定的关系为真,则将产生1,如果是,则为0   false。 107)结果的类型为int

然后你正在进行复合作业,需要

  

仅对于运算符+=-=,左操作数应为原子,合格或   指向完整对象类型的非限定指针,右边应具有整数类型;或者   左操作数应具有原子,限定或非限定算术类型,以及右边   应具有算术类型。

并且您的表达式满足约束条件。

是的,它是定义的行为。

也就是说,从语法的角度来看,由于默认operator precedence符合您的预期,您只能安全。这样没有问题,但明确(因此,肯定)永远不会伤害。

您可以将表达式重写为

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