-2

假设我有以下代码:

int i = 0;
func(i++, i++);

返回值后立即发生增量?是否保证第一个参数为0,第二个参数为1?

4

4 回答 4

7

这段代码被破坏有两个原因:

  • 在序列点之间访问变量两次,除了确定要存储哪个值之外,是未定义的行为。函数参数的评估之间没有序列点。这意味着任何事情都可能发生,您的程序可能会崩溃和烧毁(或者更有可能显示不正确或垃圾值)。
  • 函数参数的评估顺序是未指定的行为,这意味着您无法知道将首先评估哪个。

未定义的行为和序列点

为什么这些构造(使用 ++)是未定义的行为?

于 2015-06-23T10:55:39.103 回答
1

不,您的代码是错误的。函数参数的求值之间没有序列点,并且两个对同一个对象有副作用的操作只有在它们被一个序列点分隔时才被允许。

C 中不存在“立即运行”的概念。最接近的可能是序列操作的想法,其中上述序列点强制分隔两个语句或表达式的执行。

于 2015-06-23T10:54:39.273 回答
0

是否保证第一个参数为0,第二个参数为1?

不,它的未定义行为。函数参数的求值顺序不能保证从左到右或从右到左,即求值顺序是未指定的,因此副作用是未排序的i

C11:6.5 表达式 (p2)

如果标量对象的副作用相对于同一标量对象的不同副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义 [...]

于 2015-06-23T10:53:12.277 回答
-1

当你写的时候i++,你要求发生件事:

  1. 获取 的值i并将其加一
  2. 将结果存储回i

现在,您必须了解的是,尽管 #1 会立即发生,但#2 不会。思考#2 的正确方法是它发生在“某个时间之后”。这就是为什么我们不能说是什么func(i++, i++);。我们无法知道i++'s 之一是否将其结果存储在第二个发生i之前或之后。i++

于 2015-06-23T10:58:22.170 回答