2010-07-30 112 views
4

下面的代码段得到32的输出,我有点困惑为什么?逗号运算符和赋值运算符 - 返回值

int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 
+0

值得一提的是,逗号运算符有点不受欢迎。它允许一些有用的构造,但它通常对学习者来说是一个惊喜和WTF。 – Steve314 2010-07-30 08:53:24

回答

12

从第一组圆括号开始读取。

逗号运算符随后评估几个表达式中的每一个。它返回最后一个表达式的返回值 - 在本例中,它是32,因为赋值的返回值是分配的值。

http://en.wikipedia.org/wiki/Comma_operator

4
int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); // Will give you 32 
int i=(j=4,k=8,l=16); printf(“%d”, i); // Will give you 16 
int i=(j=4,k=8,l=16,m=32,n=64); printf(“%d”, i); // Will give you 64 

看到这个模式?

基本上,i被设置为无论大括号中最后一个赋值的值是多少,因为,运算符将按顺序评估每个赋值,但会返回上述情况中最后一次赋值的值。

更一般地,,运算符(comma operator)将按顺序评估一系列表达式并返回最后一个表达式的值。因此,在您的情况下,i正被赋予大括号中最后一个赋值的值(因为赋值的返回值是正在赋值的值),即为32.

4

comma operator为左关联。

它评估,随后通过j=4k=8,随后l=16最后m=32并返回32.因此,我得到的32值。

2

换句话说,括号中的任何内容首先从左到右进行评估;和最右边的表达式返回作为支架的输出结果INT I得到十进制值32

0

不是一个真正的“答案”,但应该指出的是,主要使用逗号运算符将在多个语句无效的上下文中依次评估带有副作用的表达式,如函数调用,赋值等。最重要的用途是在你希望整个宏“返回一个值”但执行多个操作的宏中。唯一的其他方法是使用gcc ({ /* multiple statements here */ })扩展名或让宏只需调用static/static inline函数。

另一个经常使用我觉得逗号操作符与for声明:

for (n=cnt; n; n--, d++, s++) 

,当我有一个if语句需要做两个紧密相连的操作,我不想要的视觉括号的杂波:

if (condition) prefix="0x", len=2; 

在这些后面的用途中,逗号运算的结果的值不是特别有用,所以也没有那么重要了,这可能是令人困惑至C初学者。