C中的相关性和序列点

时间:2011-12-02 06:05:47

标签: c sequence-points associativity

由于'?'的相关性是从右到左,连续2个'?'运营商必须这样对待,对吧?

现在,

int x=-1;
int y=x?x++?x:-1:1;

我希望这可以执行:

int y = x ? (x++?x:-1) : 1;

现在它从右到左执行,遇到第一个'?'在语句中,x的值为0,表达式为

int y= x? 0 : 1;

因此我希望y为1,但它在我的dev-cpp上显示为零。我错了吗?

3 个答案:

答案 0 :(得分:2)

您的评估顺序错误。在a ? b : c中,始终首先评估a,然后评估bc

我已经标记了你的例子,以便我可以识别子表达式:

            c
int y=x?x++?x:-1:1;
      a bbbbbbbb
评估

(a),得到-1,因此评估(b)。在那里,x++被评估,再次产生-1,因此评估(c)。此时,x为0。

或者,使用更详细,更清晰的代码,就像你说的那样:

int x = -1;
int y;
if (x != 0)
{
    int new_x = x + 1;
    if (x != 0)
    {
        y = new_x;
    }
    else
    {
        y = -1;
    }
}
else
{
    y = 1;
}

答案 1 :(得分:1)

操作:

Assign y to value = 
    if(x): --> x = -1, so true as it is non-zero
    {
      if(x): --> x = -1 ,so true as x will increment later due to post increment
       x= x +1; --> increment x, so x = 0 . This is the value assigned. So y = 0;
     else:
       -1
    }
    else: 
    {
      1
    }

希望这有帮助!

答案 2 :(得分:0)

你的问题的答案是,在C / C ++ int y = x ? (x++?x:-1) : 1;中,我们将在?处点击两个序列点。在序列结束后,对序列点变量的任何更新操作都将生效。让我们来看看我们的示例。

第一个序列点是左起第一个?

x=-1; (Actual Value)
x=-1; (Value used in expression)
y=-1?(x++?x:-1):1;

第二个序列点是左起第二个?。如上所述,更新操作在序列之后是有效的,因此即使x++存在,此序列中使用的值为-1,更新后的值将用于以下内容。

x=0; (Actual Value, bcoz of x++)
x=-1; (Value used in expression)
y=-1?x:-1;

现在它将是

x=0; (Actual Value)
x=0; (Value used in expression)
y=x;
y=0;

希望现在有意义。