假设我有以下代码:
int i = 0;
func(i++, i++);
返回值后立即发生增量?是否保证第一个参数为0,第二个参数为1?
这段代码被破坏有两个原因:
不,您的代码是错误的。函数参数的求值之间没有序列点,并且两个对同一个对象有副作用的操作只有在它们被一个序列点分隔时才被允许。
C 中不存在“立即运行”的概念。最接近的可能是序列操作的想法,其中上述序列点强制分隔两个语句或表达式的执行。
是否保证第一个参数为0,第二个参数为1?
不,它的未定义行为。函数参数的求值顺序不能保证从左到右或从右到左,即求值顺序是未指定的,因此副作用是未排序的i
。
如果标量对象的副作用相对于同一标量对象的不同副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义 [...]
当你写的时候i++
,你要求发生两件事:
i
并将其加一i
现在,您必须了解的是,尽管 #1 会立即发生,但#2 不会。思考#2 的正确方法是它发生在“某个时间之后”。这就是为什么我们不能说是什么func(i++, i++);
。我们无法知道i++
's 之一是否将其结果存储在第二个发生i
之前或之后。i++