Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的结合性与序列点_C_Sequence Points_Associativity - Fatal编程技术网

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在前面执行…这导致了一个概念,即关联性定义了执行顺序…现在很好,关联性定义了分组以形成一个实体…谢谢:)