i ++ = ++我这是真的还是假的?说明?

时间:2010-10-31 09:18:34

标签: c

这是真的还是错的?解释

i ++ = ++ i

3 个答案:

答案 0 :(得分:4)

不,不是。无论是真还是假。

问题是C / C ++没有定义++在这个表达式中发生的时间。

所以你有几种可能性:

  1. i添加1 ++i,然后将其存储在i中,然后添加again for the i ++`。
  2. i添加1 i++并保存结果以供日后使用;为i添加1 ++i,将其分配给i,然后将保存的i++值放入i
  3. i添加1到i++,然后在其上方分配++i的结果。
  4. 当你考虑i = ++i++;

    时会变得更好

    (参见评论中的链接。是否存在“序列点”的技术问题,此时应解决所有副作用。在此作业中,没有一个。)

答案 1 :(得分:1)

这取决于你实际得到的是什么:

如果您的意思是以下表达式评估为true:

i++ == ++i

然后它是未定义的行为,因为我在序列点之间被修改了两次。

如果你的意思是: 做i++;++i;做同样的事情然后答案就是那样 - 他们都增加了我。然而,如果它们是较大声明的一部分,它们是否有区别,它们是否在增量之前或之后使用该值。

实际上,这意味着i ++可能涉及在内部制作副本,以便在增量之前存储值,而++我不需要制作这样的副本。

如果你问的是i ++ = ++ i;作为一个声明,它不是一个更基本问题的有效陈述:由于其价值的“临时”性质,i ++不能成为作业的左侧。

有关更多讨论等,请参阅this linkthis one

答案 2 :(得分:1)

万一你不知道预增量和后增量之间的区别,你刚刚提出了难以理解的问题:

i = 7;
printf("%d\n", i); // precondition: result 7
printf("%d\n", ++i); // PRE-INCREMENT: result 8 !!!
printf("%d\n", i); // postcondition: result 8

i = 7;
printf("%d\n", i); // precondition: result 7
printf("%d\n", i++); // POST-INCREMENT: result 7 !!!
printf("%d\n", i); // postcondition: result 8