繁体   English   中英

在C中使用增量运算符

[英]Working of increment operator in C

#include <stdio.h>
void main()
{
int x=5,y=6;
printf("%d%d%d",x++,(y=x++),(x=y++));
}

任何人都可以解释为什么这会返回766?

首先,如果这个问题以初学者C编程课程的形式提供,那么课程/教师就是一个糟糕的课程。

这里的主要问题是'x'和'y'在序列点之前被修改了几次,这是未定义的行为(C99 / C116.5§2)。 这是一个严重的错误,因为任何事情都可能发生。 在删除++ mess之前,没有人知道这段代码是做什么的。 阅读本文然后再读一遍

此外,函数参数的评估顺序是未指定的行为。 (C99 / C116.5.2.2§10)。 也就是说,编译器可以从左到右或从右到左对它们进行评估,我们无法知道适用的顺序。 编译器不需要记录这个! 但如果你很幸运,可以记录下来。 在尝试回答问题之前,您必须阅读编译器文档以了解适用的评估顺序。 否则你必须给出两个答案。

此外,如果这是托管系统的代码,例如Windows PC,则只允许main返回'int',否则此代码将无法在C编译器上编译。

你通过在序列点之间多次修改x来调用未定义的行为,所以你很幸运/不幸的是它打印了任何东西......

是的,未定义对这样的函数的争论的解释顺序是什么。

处理可变数量的args函数(如printf)的最简单方法是从最后开始,因为你知道开始的位置!

正如'R'所指出的那样 - 在评估不明确的情况下有一个陈述是不明确的。 例如x++ = x++

这个工作堆栈概念作为提及操作LIFO第一个右操作数进入堆栈,即x = y ++(这是后增量opratore然后第一个y值,在y之后将x增加为x = 6)然后secound(这里是x = 6且y = 7但是y指定x的值为6然后x将增加1)和第三(此处x = 7并且在此声明之后x将增加1),值为766。

它首先计算最后一个表达式(x=y++) 这将返回6,因为x被赋值为y,最初为6,然后将y递增为1.现在y为7,x为6. x在此处打印。

下一个要评估的表达式是(y=x++) 与上面相同,首先指定y = x并将x增加到1.因此,值为y为6,x为7. y在此处打印。

现在是x++ 它打印7并将x递增到1。

执行strts frm从右到左。所以,x = y ++,x值变为6,之后y值变为7,然后是y = x ++,其中y的restoe值为6.之后在x ++语句中x值为7,因为先前的陈述(y = x ++)。答案766也是如此

printf("%d%d%d",x++,(y=x++),(x=y++)); 

想要添加为什么它从右端评估为前面提到的答案。 printf的所有参数都被推送到堆栈然后开始评估。 由于堆栈是LIFO,评估从结束开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM