y – = m <3是什么意思?

在查看一些C代码的例子时,我遇到了这个问题:

y -= m < 3; 

这是做什么的? 它是什么浓缩为循环或什么的? 就我所知,Google是不可能的。

根据真值, m < 310

所以当m<3y=y-1 ,当m>=3时为y=y-0

如果按照每个操作的优先顺序进行分解,则会得到:

 y = (y - (m < 3)); 

m < 3被评估并返回布尔结果10 ,所以expression式可以简化为

 y = y - 1; // if m < 3 is true 

要么

 y = y - 0; // if m < 3 is false 

这样做的目的是为了避免if条款。

我的意思是if (m < 3) { y -=1; } 因为如果m小于3,则(m < 3)为1,否则为0。

这个代码出现在一些与闰年或复活节有关的旧的参考实现中,或者可能是两者:前两个月的一月和二月是特殊的,因为它们发生在闰日之前。 编写这样的代码没有任何借口,除非你真的喜欢它的外观。 大多数人不会。

如果m小于3,则m < 3评估为1.因此,在这种情况下,y减1。 因此,避免了if语句。

我不能告诉你想要它,但我可以告诉你它是什么:

m < 3返回一个0或1的整数,表示一个布尔值。

如果m小于3,则语句评估为: y -= 1y = y - 1 ;

如果m大于或等于3,则语句评估为y -= 0y = y - 0 。 总的来说,在这种情况下,声明什么都不做。

如果m小于3,则m m<3返回1,否则为0

那么y = y-1或者y = y-0

我同意代码相当于if(m<3) y=y-1;

然而这是不安全的代码,因为虽然FALSE总是0,但TRUE有一些定义。 现在,在大多数编程系统中,TRUE等于1,但在较早的系统中,它等于-1(其中所有位设置为开,而不是最后一个)。 所以如果这个代码运行在一个较老的平台上,它可以转化为if(m<3) y=y-(-1); 或者if(m<3) y=y+1; 跨系统兼容性是避免这种“聪明”代码的重要原因。