有人可以解释这是什么以及它是如何合法的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
答案 0 :(得分:22)
表达式(a = b)
的值是b
的值,因此您可以通过这种方式链接它们。它们也是正确联想的,所以一切顺利。
基本上
ArcChar = ArcBit = 0;
( 1 )与
相同ArcBit = 0;
ArcChar = 0;
因为第一个分配的值是指定值,因此0
。
关于类型,即使ArcBit
为unsigned 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编程语言:)