以下代码段获得32的输出,我有点困惑为什么?
int i=(j=4,k=8,l=16,m=32); printf(“%d”, i);
答案 0 :(得分:12)
开始在第一组括号内阅读。
逗号运算符随后会计算几个表达式中的每一个。它返回最后一个表达式的返回值 - 在这种情况下,它是32,因为赋值的返回值是赋值。
答案 1 :(得分: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。
答案 2 :(得分:4)
comma operator是关联的。
它评估j=4
后跟k=8
,然后是l=16
,最后是m=32
并返回32.因此我得到32
的值。
答案 3 :(得分:2)
换句话说,括号中的任何内容首先从左到右进行评估;并且 最右边的表达式返回 作为括号的输出,因为结果int i得到小数值32.
答案 4 :(得分:0)
不是真正的“答案”,但应该注意的是,逗号运算符的主要用途是在多个语句无效的上下文中依次计算具有副作用的表达式,例如函数调用,赋值等。最重要的用途是在宏中,您希望整个宏“返回一个值”但执行多个操作。实现此目的的唯一其他方法是使用gcc ({ /* multiple statements here */ })
扩展程序或让宏只调用static
/ static inline
函数。
我为逗号运算符找到的另一个常用用法是使用for
语句:
for (n=cnt; n; n--, d++, s++)
当我有一个if
语句需要进行两次紧密连接的操作时,我不想要大括号的视觉混乱:
if (condition) prefix="0x", len=2;
在后面的这些用法中,逗号运算符的结果值并不是特别有用,所以它对C初学者来说可能会让人感到困惑并不重要。