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

Kam*_*aze 2 c relational-operators

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

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

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

Sou*_*osh 5

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

如果指定的关系为真且如果为假,则每个运算符<(小于),>(大于),<=(小于或等于)和>= (大于或等于)将产生.107)结果有类型.10int

然后,您需要执行复合赋值

对于运算符而言+=,-=左操作数应该是指向完整对象类型的原子,限定或非限定指针,右边应该是整数类型; 或左操作数应具有原子,限定或非限定算术类型,右边应具有算术类型.

并且您的表达式满足约束.

所以是的,它是定义的行为.


也就是说,从语法的角度来看,由于默认的运算符优先级与您的期望相匹配,因此您只是安全的.这样没有问题,但明确(因此,肯定)永远不会伤害.

您可以将表达式重写为

 result += ( a[i] > 0 );
Run Code Online (Sandbox Code Playgroud)