int main()
{
int a=1;
printf("%d %d %d",a,a++,++a);
return 0;
}
上面的代码给出了输出 3 2 3 为什么???
int main()
{
int a=1;
printf("%d %d %d",a,a++,++a);
return 0;
}
上面的代码给出了输出 3 2 3 为什么???
它实际上在 c 和 c++ 中未定义。
未定义:在序列点之间修改标量值两次,这就是您的代码正在做的事情。f(i++, ++i)
是未定义的行为,因为它在i
没有中间序列点的情况下修改了两次。
这是未定义的行为
a++, ++a
在同一序列点完成,这是未定义的行为。
从未定义的行为和序列点:
在§5/4 的标准中说
在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。
这是什么意思?
非正式地,这意味着在两个序列点之间,一个变量不能被多次修改。在表达式语句中,下一个序列点通常在终止分号处,前一个序列点在前一个语句的末尾。表达式也可能包含中间序列点。
前增量和后增量的机制在此处描述: http ://c-faq.com/expr/evalorder2.html 。但是,此表达式未定义,如前面的答案中所述。