if(++i) ++i的行为是否被定义?

6

假设我有以下代码:

int main(void)
{
    int i = rand();
    if (++i) ++i;
    return i;
}

这里是否已经定义了行为?我知道i = ++i是未定义的,而在main中的第二行包含了类似的内容。 rand()调用是为了防止编译器优化我认为有问题的那一行。

3
有一个序列点,所以我会说“是”。 - Jean-François Fabre
3
如果你做类似于 if (++i) { ++i; } 这样的事情,你的问题会消失吗?不会吗?那如果是 if (++i) { x=5; ++i; } 呢? - Eugene Sh.
2
请看这里:https://en.wikipedia.org/wiki/Sequence_point 在完整表达式的末尾。此类别包括表达式语句(如赋值a=b;)、返回语句、if、switch、while或do-while语句的控制表达式,以及for语句中的所有三个表达式。 - Eugene Sh.
1
语法与程序行为无关,你可以在一行中写一个可怕的 if (++i) ++i;,但这并不意味着两个 ++i 之间没有序列点。因此,这只是一种丑陋的编写方式,在两行中编写会更清晰明了。请注意,如果 i == -1,那么 if (++i) 将不允许下一个 ++i 被执行。 - Iharob Al Asimi
@bolov C++17不适用于C。 - Christian Gibbons
显示剩余7条评论
3个回答

7

来自 C 标准

以下是描述的序列点:

...在完整表达式的求值和下一个将要求值的完整表达式之间。以下是完整表达式:不属于复合字面量的初始化器(6.7.9);表达式语句中的表达式(6.8.3)选择语句(if 或 switch)中的控制表达式(6.8.4);while 或 do 语句中的控制表达式(6.8.5);for 语句的每个(可选的)表达式(6.8.5.3);return 语句中的(可选的)表达式。

所以是的,这是有效的。我只是向您展示标准引用,以便您感到满意规则确实被说明了。


5

是的,这是明确定义的。

if条件语句中评估++i表达式后有一个序列点。


呼,谢谢你。 - Paul Logue

3

这是一个良好的定义。

if语句的条件首先被评估。增加i的副作用发生,然后增加后的值被用作if的控制表达式。如果这个表达式被评估为真,在执行if语句体中的代码之前存在一个序列点,该代码是++i


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接