后增量运算符是否可以保证立即运行?

时间:2015-06-23 10:51:38

标签: c c89 post-increment ansi-c

假设我有以下代码:

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

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

4 个答案:

答案 0 :(得分:7)

此代码有两个原因:

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

Undefined behavior and sequence points

Why are these constructs (using ++) undefined behavior?

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

  

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

没有。它未定义的行为。从左到右或从右到左不保证函数参数的评估顺序,即评估顺序未指定,因此对i的副作用未被排序。

C11:6.5表达式(p2)

  

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

答案 3 :(得分:-1)

当您撰写i++时,您要求两个事情发生:

  1. 获取i的值并向其添加一个
  2. 将结果存储回i
  3. 现在,您必须了解的是,虽然#1立即发生,但#2不会。思考#2的正确方法是它发生在"以后的某个时间"。这就是为什么我们无法说出func(i++, i++);的作用。我们无法知道其中一个i++是否会在第二个i发生之前或之后将其结果存回i++