return(i++)的执行顺序是怎样的?返回值又是多少?

iamwiner 2004-10-23 10:22:37
.
...全文
702 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangfasheng 2004-10-23
  • 打赏
  • 举报
回复
lynnboy(lynnboy) ( ) 信誉:100
有道理
ftkghost 2004-10-23
  • 打赏
  • 举报
回复
不好意思 局部变量是放在栈中
用new申请的空间才在堆中

楼上说的没错
谢谢指教`~~~
iamwiner 2004-10-23
  • 打赏
  • 举报
回复
我按 malligator(大螟) 的理解是:
;是一个顺序点,
所用的副作用都在进入下一个顺序点(sequence point)前被计算。
所以任何情况下,I++都是被计算了的.

所以 我认为任何情况下
return(i++)的执行顺序是:
(1)保存i的值(一个临时变量中)
(2)递增i
(3)返回已保存的值

请高手指点...
wybing 2004-10-23
  • 打赏
  • 举报
回复
楼上几位说的有理

i在栈中
全局变量: return(i++); <==> return i ; i=i+1;
局部变量: return(i++); <==> return i ; //应该没有i=i+1这个动作发生了吧.return的
// 动作就是返回值,然后释放.即然后i都不存在了,
// 自然也就没有什么i=i+1发生了,
at_yuan2 2004-10-23
  • 打赏
  • 举报
回复
int fun(int x)
{
return (i++);
}

其实就是:
int fun(int x)
{
return i; //返回
i+=1; //当然不会被执行的。
}
malligator 2004-10-23
  • 打赏
  • 举报
回复
语句 states = 50; 的副作用(side effect)是将变量 states 的值设置为50。这是副作用?这看起来更像是主要目的!然而,从 C 的角度来看,主要目的是对表达式求值。给 C 一个表达式 4 + 6,C 将计算它的值为 10。给 C 一个表达式 states = 50,C 将计算它的值为 50。使用这个表达式的值还可以构造这样的表达式 states2 = states = 50。给赋值运算符一样,增量运算符和减量运算符也有副作用,它们主要由于副作用而被使用。

所用的副作用都在进入下一个顺序点(sequence point)前被计算。顺序点是程序执行中的一点。在 C 中,语句里的分号标志了一个顺序点。它一位着在一个语句中赋值运算符、增量运算符及减量运算符所作的全部修改必须在程序进入下一个语句前发生。任何一个完整的表达式(full expression)的结束也是一个顺序点。

完整的表达式--它不是一个更大的表达式的子表达式。完整表达式的例子包括一个表达式语句里的表达式和在一个 while 循环里做为判断条件的表达式。

顺序点阐述后缀增量动作何时发生:
while (guests++ < 10) printf(“%d\n“, guests);
初学者可能被说教,“先使用,在增加”,认为 guests 的值在 printf() 中被打印出来后在自增。因为 “guests++ < 10” 是 while 循环的判断条件,所以它是一个完整表达式,这个表达式的结束就是一个顺序点。C 保证副作用(副作用:guest变量增加1。是的,它确实是副作用。在计算了表达式的值后,变量内容被修改。)在程序进入 printf() 之前发生。

现在考虑下面这个语句:
y = (4 + x++) + (6 + x++);
表达式 “ 4 + x++“ 不是一个完整表达式,所以 C 不能保证再计算这个表达式的值后立即增加 x。这里完整表达式是整个赋值语句,并且分号标记了顺序点,所以 C 能保证的是程序在执行完整个语句后将 x 自增两次。C 没有规定 x 是在每个子表达式被计算后增加还是在整个表达式被计算后增加。这是我们要避免使用这类语句的原因。
Squall1009 2004-10-23
  • 打赏
  • 举报
回复
i是在栈中的,

不过return(i++);返回的结果就是i,然后i自加一,

不过i是局部变量的话i自加一也没什么意义了.
lynnboy 2004-10-23
  • 打赏
  • 举报
回复
错了啦!有什么道理。
局部变量所在的叫“运行栈”不叫“堆”。
C/C++语言规定:在__Sequence point__处,所有操作必须被求值完成。
sequence point包括函数调用表达式的前后,和所有其他表达式的完整表达式。
return i++;
其中,(i++)就是一个完整表达式,所以在遇到(;)的时候必须被求值。
就是说如果i是个整数,则虽然i所在的栈空间马上会被return释放掉,但仍然会被将其值copy到返回值所在的栈空间后被加一。(当然聪明的编译器可能把它省略)
realzhongye 2004-10-23
  • 打赏
  • 举报
回复
楼上讲的有道理,支持!
ftkghost 2004-10-23
  • 打赏
  • 举报
回复
我认为
如果return的是局部变量
i在堆上的空间在函数结束后会释放掉 ++就是无用的操作

如果i是全局变量,那就是返回i的原值,i再加上1

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧