一条线上有两个相同的标志?

时间:2011-08-30 13:40:44

标签: c

有人可以解释这是什么以及它是如何合法的C代码?我在此代码中找到了这一行:http://code.google.com/p/compression-code/downloads/list,这是Adaptive Huffman Coding的Vitter算法的C实现

ArcChar = ArcBit = 0;

从功能:

void arc_put1 (unsigned bit)
{
    ArcChar <<= 1;

    if( bit )
        ArcChar |= 1;

    if( ++ArcBit < 8 )
        return;

    putc (ArcChar, Out);
    ArcChar = ArcBit = 0;
}

ArcChar是int,ArcBit是unsigned char

10 个答案:

答案 0 :(得分:22)

表达式(a = b)的值是b的值,因此您可以通过这种方式链接它们。它们也是正确联想的,所以一切顺利。

基本上

ArcChar = ArcBit = 0;

1 )与

相同
ArcBit = 0;
ArcChar = 0;

因为第一个分配的值是指定值,因此0

关于类型,即使ArcBitunsigned char,分配结果也会扩展为int


1 然而,

答案 1 :(得分:6)

它将两个变量都设置为零。

int i, j;
i = j = 0;

与写作相同

int i, j;
j = 0;
i = j;

或写作

int i, j;
i = 0;
j = 0;

答案 2 :(得分:6)

ArcChar = ArcBit = 0;

赋值是左关联的,所以它相当于:

ArcChar = (ArcBit = 0);

ArcBit = 0的结果是新确定的值,即 - 0,因此将0分配给ArcChar

是有意义的

答案 3 :(得分:5)

这只是赋值运算符的链接。该标准在6.5.16 Assignment operators中说明:

  

赋值运算符应具有可修改的左值作为其左操作数。   赋值运算符将值存储在左操作数指定的对象中。一个   赋值表达式具有赋值后左操作数的值,但不是   左值。赋值表达式的类型是左操作数的类型,除非   左操作数具有限定类型,在这种情况下,它是类型的非限定版本   左操作数。更新左操作数的存储值的副作用应为   发生在前一个和下一个序列点之间。

所以你可以这样做:

a=b=2; // ok

但不是这样:

a=2=b; // error

答案 4 :(得分:3)

它将ArcBit分配给0,然后将ArcChar分配给表达式ArcBit = 0的值(即0

答案 5 :(得分:3)

赋值运算(a = b)本身返回一个rvalue,可以进一步分配给另一个左值; c =(a = b)。最后,a和c都将具有b的值。

答案 6 :(得分:1)

在某些语言中,分配是语句:它们会导致某些操作发生,但它们本身没有值。例如,在Python 1 中禁止编写

x = (y = 10) + 5

因为在期望值的地方无法使用作业y = 10

但是,C是分配为表达式的众多语言之一:它们会产生一个值,以及它们可能具有的任何其他效果。它们的值是指定的值。上面的代码行在C中是合法的。

在一行上使用两个等号符号的解释如下:

ArcChar = (ArcBit = 0);

即:ArcChar正在分配ArcBit = 0的值,即0,因此这两个变量最终都为0


1 x = y = 0在Python中实际上是合法的,但它被认为是赋值语句的特例,并且尝试做任何更复杂的赋值都会失败。< / em>的

答案 7 :(得分:1)

你可以这样做: http://en.wikibooks.org/wiki/C_Programming/Variables

此外,

[a int] = 0;是可能的。

[a char] = 0;也是可能的。

arcbit和arcchar等于0.

答案 8 :(得分:1)

正如Hasturkun所说,这是由于运营商的关联性顺序 C Operator Precedence and Associativity

答案 9 :(得分:1)

C中的赋值是表达式,而不是语句。您也可以自由分配不同大小的值(unsigned char为int,反之亦然)。欢迎使用C编程语言:)