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

时间:2018-02-20 16:56:51

标签: c

假设我有这段代码:

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

此处是否定义了行为?我知道i = ++i未定义,main中的第二行包含类似内容。 rand()调用是为了阻止编译器优化我认为是有问题的行。

3 个答案:

答案 0 :(得分:7)

来自C standard

以下是: -

中描述的序列点
  

....   在评估完整表达式和下一个要评估的完整表达式之间。以下是完整表达式:不属于复合文字的初始化程序(6.7.9);表达式语句(6.8.3)中的表达式; 选择语句的控制表达式(if或switch)(6.8.4); while或do语句的控制表达式(6.8.5); for语句的每个(可选)表达式(6.8.5.3);返回语句中的(可选)表达式。

所以是的,这是有效的。我只是向您展示标准报价,以便您对在某处陈述规则感到满意。

答案 1 :(得分:5)

是的,这是明确定义的。

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

答案 2 :(得分:3)

这是明确界定的。

首先评估if的条件。发生递增i的副作用,然后将i的递增值用作if的控制表达式。如果此计算结果为true,则在评估if正文中的语句之前有一个序列点,即++i