我已经看到了很多关于此问题的答案,但我无法得到它的实际原因,有些人说它使用堆栈概念,而在其他人提到未定义的行为......所以请让我知道..什么是正确的....我的代码是......我已经编译并在代码块上运行它....
int i=10;
printf("\nThe initial value of i -> %d",i);
printf("\n");
printf("The value of --i-> %d and that of --i -> %d and that of i -> %d",--i,--i,i);
printf("\n");
我得到的输出是8 8 8 ...请告诉我它是如何被评估的......在C。
当我修改上述程序时....
i=10;
printf("\nThe initial value of i -> %d",i);
printf("\n");
printf("The value if i++ -> %d and that of --i-> %d and that of --i -> %d and that of i -> %d",i++,--i,--i,i);
printf("\n");
在这种情况下,我得到的输出是8 9 9 9 ...所以这些东西怎么样......并在C中评估....请让我知道
答案 0 :(得分:2)
这是一种未定义的行为。
printf("The value of --i-> %d and that of --i -> %d and that of i -> %d",--i,--i,i);
i
在上述声明中被多次修改。
C ++中的标准说
在上一个和下一个序列点之间,标量对象的表达式评估最多只能修改一次存储值。
和
只能访问先前值以确定要存储的值。
这意味着,在两个序列点之间,变量不能被多次修改,如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问都必须直接参与计算要写的价值。
答案 1 :(得分:-2)
预减量优先于后增量。 那么所发生的是价值,在我存储的地址(比如地址x),减少两次并变为8。
现在i ++的第一个参数被评估了。 由于这是后增量,首先使用值(因此打印8)然后递增。 因此, 最后发生的事情是地址x的值增加1并变为9。
现在,我们已经完成了预先减少。 因此printf只记得打印i的地址值,即我们假设的地址x。
最后因为第四个论点i,再打印了9个。