首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >I= i++的行为真的是未定义的吗?

I= i++的行为真的是未定义的吗?
EN

Stack Overflow用户
提问于 2011-02-11 20:14:05
回答 9查看 14.7K关注 0票数 21

可能重复:

Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

根据c++标准,

代码语言:javascript
复制
i = 3;
i = i++;

将导致未定义的行为。

我们使用术语“未定义的行为”,如果它可以导致不止一个结果。但在这里,无论计算顺序如何,i的最终值都将是4,所以这不应该被称为“未指定的行为”吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-02-11 20:17:48

这句话,"…i的最终值将是4,不管…的顺序如何“是不正确的。编译器可能会发出与以下内容等效的代码:

代码语言:javascript
复制
i = 3;
int tmp = i;
++i;
i = tmp;

或者这样:

代码语言:javascript
复制
i = 3;
++i;
i = i - 1;

或者这样:

代码语言:javascript
复制
i = 3;
i = i;
++i;

至于术语的定义,如果答案保证是4,那就不是未指定或未定义的行为,它将是已定义的行为。

根据标准(Wikipedia),它是未定义的行为,所以它甚至可以自由地这样做:

代码语言:javascript
复制
i = 3;
system("sudo rm -rf /"); // DO NOT TRY THIS AT HOME … OR AT WORK … OR ANYWHERE.
票数 30
EN

Stack Overflow用户

发布于 2011-02-11 20:28:02

不,我们不使用术语“未定义的行为”,当它可以简单地导致一个以上的算术结果。当行为被限制为不同的算术结果(或者,更一般地,一些可预测的结果集)时,它通常被称为未指定的行为。

未定义的行为意味着完全不可预测和无限的后果,如格式化计算机上的硬盘驱动器或简单地使您的程序崩溃。i = i++是一种未定义的行为。

在这种情况下,i应该是4的想法是从哪里得到的还不清楚。在C++语言中,绝对没有任何东西可以让您得出这样的结论。

票数 9
EN

Stack Overflow用户

发布于 2011-02-11 20:24:57

在C和C++中,两个sequence points之间的任何操作的顺序完全由编译器决定,不能依赖于。该标准定义了一个组成序列点的列表,从内存中看,这是

在调用函数之前,语句后面的分号和所有函数参数的逗号与||

  1. ||

查看维基百科上的页面,这些列表更完整,描述也更详细。序列点是一个非常重要的概念,如果您还不知道它的含义,那么立即学习它将使您受益良多。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4968854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档