-2

可能重复:
谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等……)

int main()
{
int a=1;
printf("%d %d %d",a,a++,++a);
return 0;
}

上面的代码给出了输出 3 2 3 为什么???

4

3 回答 3

3

它实际上在 c 和 c++ 中未定义。

未定义:在序列点之间修改标量值两次,这就是您的代码正在做的事情。f(i++, ++i)是未定义的行为,因为它在i没有中间序列点的情况下修改了两次。

一个很好的定义列表

于 2013-01-02T11:07:59.220 回答
2

这是未定义的行为

a++, ++a在同一序列点完成,这是未定义的行为。

从未定义的行为和序列点

在§5/4 的标准中说

在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。

这是什么意思?

非正式地,这意味着在两个序列点之间,一个变量不能被多次修改。在表达式语句中,下一个序列点通常在终止分号处,前一个序列点在前一个语句的末尾。表达式也可能包含中间序列点。

于 2013-01-02T11:06:05.197 回答
0

前增量和后增量的机制在此处描述: http ://c-faq.com/expr/evalorder2.html 。但是,此表达式未定义,如前面的答案中所述。

于 2013-01-02T11:12:49.443 回答