[英]Associativity and Sequence Points in C
由于“?”的关联性 是从右到左,连续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上显示为零。我在哪里错?
您的评估顺序有误。 在a ? b : c
a ? b : c
, a
总是先进行计算,然后或者b
或c
进行评价。
我已经标记了您的示例,以便可以标识子表达式:
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;
}
操作方式:
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
}
希望这可以帮助!
您的问题的答案是在C / C ++中int y = x ? (x++?x:-1) : 1;
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;
希望这现在有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.