在C中,是以下陈述
a+=3,b=c*2,d=a+b;
相当于以下语句块:
a+=3;
b=c*2;
d=a+b;
我相信你明白我的观点。我们可以安全地使用C中同一语句中用逗号分隔的多个数学表达式吗?在什么情况下这可能会造成问题?
答案 0 :(得分:3)
如果您想到这样的逗号表达式列表可能会更容易:
((a += 3, b = c * 2), d = a + b)
首先评估最里面的逗号表达式:
a += 3, b = c * 2
该表达式将分两步进行评估:
a += 3
b = c * 2
a += 3
的结果将被编译器抛弃,但是赋值仍然发生,只是返回的结果被丢弃了。第一个逗号表达式的结果是b
(将c * 2
(无论是什么))。
第一个逗号表达式的结果然后在下一个逗号表达式的左侧:
b = c * 2, d = a + b
然后将按顺序排序为
b = c * 2
d = a + b
表达式b = c * 2
的结果被丢弃(但仍在评估时仍然会发生赋值),并且完整表达式的结果为d
(a + b
)。
整个表达式的结果将是d
。
答案 1 :(得分:1)
他们是一样的。
在C中,逗号运算符计算其左侧,忽略返回值(例如,返回x = y是新值),评估右侧并返回其结果(如果有)。使用逗号运算符是为了评估并获得左侧内容的副作用,而不使用(例如丢弃)其值。