将逻辑运算的结果相加(应该只是0
or )是否可以(定义的行为1
)?
如果我想计算大于零的数字,我可以这样做吗?(或者有更好的方法吗?)
int a[3] = {1,-5,3};
int result = 0;
for( int i = 0 ; i<3; i++)
{
result += a[i]>0;
}
将逻辑运算的结果相加(应该只是0
or )是否可以(定义的行为1
)?
如果我想计算大于零的数字,我可以这样做吗?(或者有更好的方法吗?)
int a[3] = {1,-5,3};
int result = 0;
for( int i = 0 ; i<3; i++)
{
result += a[i]>0;
}
引用C11
,第 §6.5.8 章,(强调我的)
如果指定的关系为真且为假,则每个运算符
<
(小于)、>
(大于)、<=
(小于或等于)和>=
(大于或等于)都应产生。107)结果类型为。1
0
int
然后您正在执行复合作业,其中需要
仅对于运算符
+=
,-=
左侧操作数应为指向完整对象类型的原子、合格或非合格指针,右侧应为整数类型;或左操作数应具有原子、合格或不合格的算术类型,而右操作数应具有算术类型。
并且您的表达式满足约束。
所以是的,这是定义的行为。
也就是说,从语法的角度来看,您只是安全的,因为默认运算符优先级符合您的期望。这样没有问题,但是明确(因此,当然)永远不会受到伤害。
您可以将表达式重写为
result += ( a[i] > 0 );