int i=-1;
int a=65;
int b=a*i + ++i;
b的价值是多少? 这里,=,+的关联性是从左到右,*,前缀增量(++)的关联性是从右到左。
那么对于int b = a * i + ++ i,我应该考虑什么样的评估顺序;
从左到右? 右到左? 为什么呢?
答案 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建议的那样,你不应该修改和使用同一个表达式中的值。(不是一个好习惯)