我无法理解下面代码的输出是如何“-3”?
#include <stdio.h>
void main()
{
int a = -5;
int k = (a++, ++a);
printf("%d\n", k);
}
c或c ++中这个int k = (a++, ++a);
语句背后的概念是什么?
答案 0 :(得分:5)
它起作用的原因是,
运算符创建了sequence point。
§5.19.1(逗号运算符)
逗号运算符从左到右分组。 以逗号分隔的一对表达式从左到右评估;左表达式是废弃的值表达式(第5条)。 在与右表达式相关联的每个值计算和副作用之前,对与左表达式相关联的每个值计算和副作用进行排序。结果的类型和值是右操作数的类型和值;结果与右操作数具有相同的值类别,如果右操作数是glvalue和位域,则是一个位域。如果右操作数的值是临时值(12.2),则结果是临时值。
因此:
a
已初始化为-5
。 a++
执行,并将a
修改为-4.
++a
执行,将a
修改为-3
,并将-3
返回k
。答案 1 :(得分:1)
这不是未定义的行为。
在您的代码中,
int k = (a++, ++a);
正在使用"comma operator"。在a
初始化为-5
后,基本上是什么,
a++
,弃掉结果。邮寄的副作用 - ++
,a
现在为-4
,
,序列点。++a
,返回结果。 a
现在-3
(前++
),已分配到k
。参考:来自C11
标准,章节6.5.17
逗号运算符的左操作数被计算为void表达式; 在其评估与右操作数之间存在一个序列点。然后评估右操作数;结果有其类型和价值。
答案 2 :(得分:1)
这在C和C ++中都非常明确。
用逗号分隔的表达式从左到右进行计算。
整个表达式的值将是第二个表达式的值。
因此,要分解(a++, ++a)
,首先评估a++
(然后a
为-4),结果(-5)丢弃,然后评估++a
。该值(-3)分配给k
。
答案 3 :(得分:1)
这里使用一个带逗号运算符的表达式作为初始化器
int k = (a++, ++a);
根据C标准(同样适用于C ++)(6.5.17逗号运算符):
2逗号运算符的左操作数被计算为void 表达;它的评估与之间存在一个序列点 正确的操作数。 然后评估右操作数;结果 有其类型和价值
最初变量a用-5
初始化int a = -5;
因此,在评估了逗号运算符的第一个表达式之后,由于事实是&#34; ,它的评估与右操作数之间存在一个序列点 &#34; a将等于-4(a ++)。使用逗号运算符的整个表达式的结果将是在评估右表达式++a
之后的值。其值为-3
因此可变k将用-3初始化。相同的值将具有变量a。