4
A
回答
12
从第一组圆括号开始读取。
逗号运算符随后评估几个表达式中的每一个。它返回最后一个表达式的返回值 - 在本例中,它是32,因为赋值的返回值是分配的值。
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=4
k=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初学者。
相关问题
- 1. 移动赋值运算符VS拷贝赋值运算符
- 2. 赋值运算符 - 自赋值
- 3. PHP赋值运算符=&
- 4. 重载赋值运算符
- 5. 赋值运算符在
- 6. 嫩枝赋值运算符
- 7. 重载赋值运算符
- 8. 赋值=运算符超载
- 9. 赋值运算符继承
- 10. 默认赋值运算符
- 11. BigDecimal的赋值运算符
- 12. 算术和赋值运算符重载 - 返回值,范围,结合表达式
- 13. Javascript逗号运算符
- 14. Javascript或和赋值运算符
- 15. 向量和赋值运算符
- 16. 句柄类和赋值运算符
- 17. 运算符逗号重载
- 18. C++ 11字符串赋值运算符
- 19. 等于运算符“==”表现得像赋值运算符“=”
- 20. boost :: phoenix3逗号运算符
- 21. 赋值运算符重载:void返回回访参考参数
- 22. 混合赋值和复合赋值运算符 - 优先级?
- 23. 转换运算符如何返回值?
- 24. 重载运算符的返回值
- 25. 运算符+()重载的返回值
- 26. 什么是返回类型的赋值运算符?
- 27. C++移动赋值运算符返回类型
- 28. 重载赋值运算符以返回std :: vector
- 29. 重载赋值运算符而没有返回语句
- 30. 赋值运算符何时应返回const T&,T&或T?
值得一提的是,逗号运算符有点不受欢迎。它允许一些有用的构造,但它通常对学习者来说是一个惊喜和WTF。 – Steve314 2010-07-30 08:53:24