如果从左到右和从右到左 - 运算符的关联性都出现在一个语句中那么将考虑什么?

时间:2014-03-19 17:01:23

标签: c associativity

int i=-1;
int a=65;
int b=a*i + ++i;

b的价值是多少? 这里,=,+的关联性是从左到右,*,前缀增量(++)的关联性是从右到左。

那么对于int b = a * i + ++ i,我应该考虑什么样的评估顺序;

从左到右? 右到左? 为什么呢?

3 个答案:

答案 0 :(得分:5)

不要考虑相关性。考虑评估的顺序,不幸的是在这种情况下它是不确定的 在表达式

int b=a*i + ++i;   

您正在修改i以及在调用未定义行为的同一表达式中使用它。

C99声明:

  

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,只能访问先前值以确定要存储的值

此外,我建议你阅读c-faq: Q 3.8

答案 1 :(得分:2)

在这里你应该考虑运算符优先级。这里表达式是根据运算符的优先级求解的,所以一次只应用一个关联性 关联性进入图片when the operator has same precedence,在这种情况下,关联性将是相同的 在您的问题b=a*i + ++i i中,undefined behavoiur使用了两次结果。

否则将被评估为, ++后跟*然后+ operation according to precedence。 如果这样,那么答案就是,

b=a*i + ++i
b=65*i + 0
b=65*0 + 0
b=0 + 0
b=0

但是编译器可以使用i的存储值而不是在++ i之后使用值,

b=a*i + ++i
b=a*-1 + 0
b=-65 + 0
b=-65

这导致未定义的行为,因为b可以是0或-65。此外,您可以看到associativity doesn't create problem while evaluating operators with same precedence will have same associativity以及评估按优先顺序排列,并按照关联性排序。

答案 2 :(得分:-1)

关联性和优先性有两个。

首先检查优先级,然后检查关联性。

在你的表达式int b = a * i + ++ i;

++具有比+和*更高的优先级,因此首先评估++。 在此之后+和*,*具有更高的优先级,因此*被证实。 在最后的+被评估。

正如haccks建议的那样,你不应该修改和使用同一个表达式中的值。(不是一个好习惯)