在查看一些示例C代码时,我遇到了这个:
y -= m < 3;
这是做什么的?它有点浓缩for循环或什么?据我所知,谷歌是不可能的。
答案 0 :(得分:75)
m < 3
可以是1
或0
,具体取决于真值。
y=y-1
为m<3
时为true
,y=y-0
时为m>=3
答案 1 :(得分:25)
如果按每个操作的优先顺序对其进行细分,则会得到:
y = (y - (m < 3));
m < 3
得到评估并返回布尔结果1
或0
,因此表达式可以简化为
y = y - 1; // if m < 3 is true
或
y = y - 0; // if m < 3 is false
这样做的目的是避免if
条款。
答案 2 :(得分:14)
我的意思是if (m < 3) { y -=1; }
,因为如果m小于3,则(m < 3)
为1,否则为0。
代码出现在一些古老的参考实现中,与闰年或复活节有关,或者可能两者:1月和2月的前两个月是特殊的,因为它们发生在闰日之前。除非你真的喜欢它的外观,否则没有任何借口可以编写这样的代码。大多数人没有。
答案 3 :(得分:10)
m < 3
求值为1.因此,在这种情况下,y减1。因此,if语句被避免。
答案 4 :(得分:2)
我不能告诉你希望 ,但我可以告诉你它的作用:
m < 3
返回一个0或1的int,表示一个布尔值。
如果m小于3,则该语句将评估为:y -= 1
或y = y - 1
;
如果m大于或等于3,则语句将评估为y -= 0
或y = y - 0
。总的来说,在这种情况下,声明什么都不做。
答案 5 :(得分:2)
最有趣的是它创建的代码量。在简单的Arduino系统(1.8.10版编译器)上,原始版本和
// header.h
#ifndef _header_h_
#define _header_h_
struct DescribedType {
int member;
char* variables;
};
#endif
// module.c
#include "header.h"
struct ForwardDeclaration;
ForwardDeclaration* allocForward();
int main(){
DescribedType someType;
ForwardDeclaration* someValue = allocForward();
return 0;
}
struct ForwardDeclaration {
int declaredLater;
};
创建相同的代码大小。但是,“ if”版本:
y -= (m < 3 ? 1 : 0);
实际上减少了8个字节的代码(减少了4个指令)。一个很好的例子,说明如何创建聪明的代码不一定会导致代码更小,尤其是对于一个好的编译器而言。
答案 6 :(得分:0)
<
对等于=
的符号具有更高的优先级
因此m<3
如果m
小于3则返回1,否则为0
然后y = y - 1或y = y - 0
答案 7 :(得分:-1)
我同意该代码相当于if(m<3) y=y-1;
然而,这是不安全的代码,因为虽然FALSE始终为0,但TRUE有几个定义。现在,在大多数编程系统中,TRUE等于1,但在较旧的系统中,它等于-1(其中所有位都设置为打开,而不仅仅是最后一位)。
因此,如果此代码在较旧的平台上运行,则可以转换为if(m<3) y=y-(-1);
或if(m<3) y=y+1;
跨系统兼容性是避免像这样的“聪明”代码的一个重要原因。