这个语句如何工作`int k =(a ++,++ a);`in c或c ++

时间:2015-06-29 12:13:20

标签: c++ c initialization comma comma-operator

我无法理解下面代码的输出是如何“-3”?

#include <stdio.h>
void main()
{
    int a = -5;
    int k = (a++, ++a);
    printf("%d\n", k);
}

c或c ++中这个int k = (a++, ++a);语句背后的概念是什么?

4 个答案:

答案 0 :(得分:5)

它起作用的原因是,运算符创建了sequence point

§5.19.1(逗号运算符)

  

逗号运算符从左到右分组。 以逗号分隔的一对表达式从左到右评估;左表达式是废弃的值表达式(第5条)。 在与右表达式相关联的每个值计算和副作用之前,对与左表达式相关联的每个值计算和副作用进行排序。结果的类型和值是右操作数的类型和值;结果与右操作数具有相同的值类别,如果右操作数是glvalue和位域,则是一个位域。如果右操作数的值是临时值(12.2),则结果是临时值。

因此:

  1. a已初始化为-5
  2. 然后a++执行,并将a修改为-4.
  3. 然后++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。