C语言中的结合性与序列点
因为“?”的关联性是从右向左的,所以任何两个连续的“?”运算符都必须这样处理,对吗 现在, 我希望本协议的执行如下:C语言中的结合性与序列点,c,sequence-points,associativity,C,Sequence Points,Associativity,因为“?”的关联性是从右向左的,所以任何两个连续的“?”运算符都必须这样处理,对吗 现在, 我希望本协议的执行如下: int y = x ? (x++?x:-1) : 1; 现在,由于它是从右向左执行的,当遇到语句中的第一个“?”时,x的值是0,表达式是 int y= x? 0 : 1; 因此,我期望y为1,但在我的dev-cpp上它显示为零。我错在哪里?您的求值顺序错了。在a中?b:c,a总是先求值,然后求值b或c 我已经标记了您的示例,以便识别子表达式: c in
int y = x ? (x++?x:-1) : 1;
现在,由于它是从右向左执行的,当遇到语句中的第一个“?”时,x的值是0,表达式是
int y= x? 0 : 1;
因此,我期望y为1,但在我的dev-cpp上它显示为零。我错在哪里?您的求值顺序错了。在
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;
}
您的评估顺序错误。在
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
}
希望这有帮助 操作:
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++
inty=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;
希望这现在有意义。您的问题的答案是在C/C++inty=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;
希望这现在有意义。在a=b=c=5;它从左到右执行为a=(b=(c=5))right…为什么我的问题的上下文不从右到左执行?为什么使用初始值“x”?在a=b=c=5中;它是从左到右执行的,作为a=(b=(c=5))right…为什么我的问题的上下文不是从右到左执行的?为什么使用初始值“x”?所以,它就像正常的条件值y…的关联性在哪里?我不明白你的问题,为什么不按a=b=c=5从左到右的顺序做呢。关联性指定如何对运算符的多个实例进行分组。然而,这与此无关:a?Bc:d:e
除了a之外,不能以任何方式解析?(b?c:d):e
(绝对没有其他方法可以形成有效的表达式)。规范规定在a?b:c
,a
首先被评估,然后b
或c
被评估。因此,行为正如我在回答中所描述的。明白了…通常是这样读的a=b=c=5..因为=的关联性是从右到左的,c=5在前面执行…这导致了一个概念,即关联性定义了执行顺序…现在很好,关联性定义了分组以形成一个实体…谢谢:)所以,它就像普通的有条件的东西……的关联性在哪里?我不明白你的问题,为什么不按a=b=c=5从左到右的顺序做呢。关联性指定如何对运算符的多个实例进行分组。然而,这与此无关:a?Bc:d:e
除了a之外,不能以任何方式解析?(b?c:d):e
(绝对没有其他方法可以形成有效的表达式)。规范规定在a?b:c
,a
首先被评估,然后b
或c
被评估。因此,行为正如我在回答中所描述的。明白了…通常是这样读的a=b=c=5..因为=的关联性是从右到左的,c=5在前面执行…这导致了一个概念,即关联性定义了执行顺序…现在很好,关联性定义了分组以形成一个实体…谢谢:)