#包括<;标准h>;
内部主(空)
{
int i=0;
i=i++++++i;
printf(“%d\n”,i);//3
i=1;
i=(i++);
printf(“%d\n”,i);//2应该是1,不是吗?
挥发性INTU=0;
u=u+++++u;
printf(“%d\n”,u);//1
u=1;
u=(u++);
printf(“%d\n”,u);//2也应该是一,不是吗?
寄存器int v=0;
v=v+++++v;
printf(“%d\n”,v);//3(应与u相同?)
int w=0;
printf(“%d%d\n”,++w,w);//这不应该打印1吗
int x[2]={5,8},y=0;
x[y]=y++;
printf(“%d%d\n”,x[0],x[1]);//这不应该打印0 8或5 0吗?
}
C具有未定义行为的概念,即某些语言构造在语法上是有效的,但在代码运行时无法预测行为
据我所知,标准没有明确说明为什么存在未定义行为的概念。在我看来,这只是因为语言设计者希望在语义上有一定的回旋余地,而不是要求所有实现都以完全相同的方式处理整数溢出,这很可能会带来严重的性能成本,他们只是没有定义行为,因此如果编写导致整数溢出的代码,任何事情都可能发生
那么,考虑到这一点,为什么会出现这些“问题”?语言清楚地表明,某些事情会导致未定义的行为。没有问题,没有“应该”的问题。如果当其中一个涉及的变量被声明为volatile时,未定义的行为发生了变化,那么这并不能证明或改变任何事情。它是未定义的;你不能对这种行为进行推理
你最有趣的例子是
u=(u++);
是一个未定义行为的教科书示例(参见维基百科关于序列点的条目)