什么是y - = m< 3意味着什么

时间:2011-10-22 23:24:23

标签: c

在查看一些示例C代码时,我遇到了这个:

y -= m < 3;

这是做什么的?它有点浓缩for循环或什么?据我所知,谷歌是不可能的。

8 个答案:

答案 0 :(得分:75)

m < 3可以是10,具体取决于真值。

y=y-1m<3时为truey=y-0时为m>=3

答案 1 :(得分:25)

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

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

m < 3得到评估并返回布尔结果10,因此表达式可以简化为

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,则

m < 3求值为1.因此,在这种情况下,y减1。因此,if语句被避免。

答案 4 :(得分:2)

我不能告诉你希望 ,但我可以告诉你它的作用:

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

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

如果m大于或等于3,则语句将评估为y -= 0y = 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; 跨系统兼容性是避免像这样的“聪明”代码的一个重要原因。