查看: 2388|回复: 16
收起左侧

[已解决] c语言问题

 关闭 [复制链接]
abc45628
发表于 2012-12-12 09:25:11 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 abc45628 于 2012-12-17 21:13 编辑

在某段程序中有m=1;n=m+++m++,n等于什么?m呢?还有,电脑的所有运算都是在寄存器中完成吗?先计算左边的m++还是右边的m++,还有为什么编译时内存都是分配到同一个地址,不是应该随机分配吗?
narutovsop
发表于 2012-12-12 12:59:37 | 显示全部楼层
本帖最后由 narutovsop 于 2012-12-14 19:19 编辑

这个值应该是n=3,m=3,是从右向左开始计算,整个过程相当于第二个m++=m就是1,m=m+1也就是2,第一个m++=m就是2,m=m+1就是3,最后n=1+2也就是3,是先赋值后计算
如果是n=++m+++m的话就是第二个m=m+1就是2,++m=m是2,之后执行++m,m=m+1就是3,++m=m也就是3,最后m=3,n=2+3就是5,是先计算后赋值

至于内存分配不清楚,很久没玩编程了


=====================================
请看10楼,以上是我根据这个表达式本身进行的理解,未进行任何实际验证,再加上对c的原理掌握的还不是很透彻,理解的可能有误,建议楼主多参考楼下的回复,我也受益良多

另外,我以上的分析可能确实有误,为避免误导楼主和其他人,还请答疑区版主取消对我的加分

评分

参与人数 1经验 +4 收起 理由
woxihuan2011 + 4 感谢解答: )

查看全部评分

数据流谷雨
发表于 2012-12-14 13:09:41 | 显示全部楼层
本帖最后由 数据流谷雨 于 2012-12-14 13:10 编辑

我用c++编程,软件是c-free,试出来的结果和楼上不同
源码如下
#include<iostream>
using namespace std;
int main()
{
        int m=1,n;
        n=m+++m++;
        cout<<"m="<<m<<endl;
        cout<<"n="<<n<<endl;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x

评分

参与人数 1经验 +3 收起 理由
yloko + 3 感谢解答: )

查看全部评分

virusdefender
发表于 2012-12-14 13:42:35 | 显示全部楼层
本帖最后由 virusdefender 于 2012-12-14 14:01 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int m,n;
  5.         m=1;
  6.         n=m+++m++;
  7.         printf("%d",n);
  8.         return 0;
  9. }
复制代码
vc运行结果是结果n=2  m=3

但是没有多大意义

结果完全依赖具体系统在具体上下文中的具体处理。其中牵涉到运算对象的求值顺序和变量修改的实现时刻问题,要看加

操作中间没有有存在一个顺序点。

要是单看加操作先算哪一边,这个和具体的编译器有关的。

寄存器是一个存储空间,不是运算用的,但是可以保存经常要改变的量,那就定义为register类型的。

编译时内存都是分配到同一个地址  这个没看明白~~

评分

参与人数 1经验 +4 收起 理由
woxihuan2011 + 4 感谢解答: )

查看全部评分

故人已时过境迁
发表于 2012-12-14 14:26:46 | 显示全部楼层
楼上正解,最好看二楼,这个比较详细
确实是是先赋值后计算
不过赋值了还是运行了原来的结果
liruoru
头像被屏蔽
发表于 2012-12-14 14:37:12 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
adonais
发表于 2012-12-14 15:24:34 | 显示全部楼层
故人已时过境迁 发表于 2012-12-14 14:26
楼上正解,最好看二楼,这个比较详细
确实是是先赋值后计算
不过赋值了还是运行了原来的结果

二楼从表达式本身去讲解,可以说是犯错最厉害的.
既然是c语言,首先要看c标准.
iso c99 对这种增量运算有明确说明
"Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored."
这个表达式在c标准里面属于未定义,符合标准的c编译器应该是直接报错.
但是遵循"标准不对编译器的行为做规定"的原则,容许不同的编译器自行处理,也就是说不同的编译器给出的结果不同.

评分

参与人数 1经验 +3 收起 理由
yloko + 3 感谢解答: )

查看全部评分

故人已时过境迁
发表于 2012-12-14 17:47:31 | 显示全部楼层
adonais 发表于 2012-12-14 15:24
二楼从表达式本身去讲解,可以说是犯错最厉害的.
既然是c语言,首先要看c标准.
iso c99 对这种增量运算 ...

VC不会报错的,TC倒是会的,按理这程序就是C语言的基础,受教了
jiangling500
发表于 2012-12-14 18:06:20 | 显示全部楼层
其实没必要纠结谁的运算级别高的问题,如果你不知道的一个括号解决你的问题。
narutovsop
发表于 2012-12-14 19:07:11 | 显示全部楼层
我确实是单纯的根据表达式做的分析和理解,对c并没有较深入的研究和理解,也没有实际验证这个运算的结果,可能的确如楼上几位说的那样吧,是我图样图森破了,也感谢楼上各位的解答,受教了
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2026-4-15 07:57 , Processed in 0.090301 second(s), 3 queries , Redis On.

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表