0

由于 '?' 的结合性 是从右到左,任意 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 上显示为零。我错在哪里?

4

3 回答 3

2

您的评估顺序错误。In a ? b : c,a总是首先被评估,然后是borc被评估。

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

            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;
}
于 2011-12-02T06:14:38.637 回答
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
    }

希望这可以帮助!

于 2011-12-02T06:15:25.577 回答
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;

希望这现在有意义。

于 2011-12-02T06:15:28.463 回答