假设我有这段代码:
int main(void)
{
int i = rand();
if (++i) ++i;
return i;
}
此处是否定义了行为?我知道i = ++i
未定义,main
中的第二行包含类似内容。 rand()
调用是为了阻止编译器优化我认为是有问题的行。
答案 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
。