y – = m <3是什么意思?
在查看一些C代码的例子时,我遇到了这个问题:
y -= m < 3;
这是做什么的? 它是什么浓缩为循环或什么的? 就我所知,Google是不可能的。
根据真值, m < 3
是1
或0
。
所以当m<3
为y=y-1
,当m>=3
时为y=y-0
如果按照每个操作的优先顺序进行分解,则会得到:
y = (y - (m < 3));
m < 3
被评估并返回布尔结果1
或0
,所以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 -= 1
或y = y - 1
;
如果m大于或等于3,则语句评估为y -= 0
或y = 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;
跨系统兼容性是避免这种“聪明”代码的重要原因。