【发布时间】:2014-01-28 16:02:36
【问题描述】:
这是一个示例 sn-p:
int i = 4,b;
b = foo(i++) + foo(i++);
我很确定它不是未定义,因为在调用foo 之前有一个序列点。但是,如果我使用-Wall 标志编译代码,则会生成一个编译器警告,上面写着warning: operation on 'i' may be undefined。我知道上面写着may,但我想仔细检查一下我是否正确。
【问题讨论】:
-
不管有没有定义,都不应该这样编程。
-
在调用
foo之前有一个序列点,但在i++的两次评估之间没有必然的序列点。生成的代码可以评估第一个i++,然后评估第二个i++,然后执行两个函数调用,然后将结果相加。 C11(参见N1570 draft 改变了描述的方式,可能更清楚。 -
-
@JonasWielicki:不,无论如何它都是未定义的,因为
i被修改了两次,没有插入序列点(在 C99 术语中)。 -
@mafso:正如我上面所说,我相信
i++的两个实例都可以在任何一个函数调用发生之前进行评估。 N1570 6.5.2.2p10:“在函数指示符和实际参数的评估之后但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中的每个评估之前没有特别排序或者在被调用函数体的执行相对于被调用函数的执行顺序不确定之后。”
标签: c undefined-behavior sequence-points