c。减少后

时间:2011-09-30 12:34:21

标签: c

  

可能重复:
  Undefined Behavior and Sequence Points
  pre fix and post fix increment in C

请解释此程序如何打印i = 2

#include<stdio.h>
void main()
{
    int i=1;
    i=i+2*i--;
    printf("%d",i);
}

根据逻辑,它应该评估值3,因为 - 1 + 2 * 1 = 3 但这首先评估i--并更新i的值。为什么会这样? :S

3 个答案:

答案 0 :(得分:3)

修改表达式中的变量,然后将该结果分配给同一个变量是未定义的行为,因此您所看到的任何行为在技术上是正确的(包括重新启动计算机,或摧毁宇宙)。来自C standard,§6.5.2:

  

在前一个和下一个sequence point之间,一个物体应具有它   储值通过评估一次最多修改一次   表达

要解决此问题,请将后递减移出表达式,如下所示:

int main() {
    int i=1;
    i=i+2*i;
    i--;
    printf("%d",i);
    return 0;
}

答案 1 :(得分:2)

i=i+2*i--;

此代码调用未定义的行为。您正在修改i并在单个序列点内读取它。请阅读Sequence Points

How can I understand complex expressions like the ones in this section, and avoid writing undefined ones? What's a ``sequence point''?

答案 2 :(得分:-1)

i = i + 2 * i--;
i = 1 + 2 * 1;  (as it is post decrement so the i value is still 1)
i = 1 + 2;   (multiplication has higher priority, post decrement still not made)
i = 3 ;
on the next statement
printf("%d",i); the post decrement is done here on i and i value is 3 so 3 -1 = 2
The output is 2 

对相同的陈述进行预先减少或预先递增,而在下一个陈述中进行后递增和后递减。我记得我在某个地方看过它 这是我已经解释过,让你明确前后操作

但主要是相信 当您尝试对要赋予值的同一变量执行递增和递减操作时,ITS未定义行为