免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zeus82
打印 上一主题 下一主题

有关于x++的一个问题 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-07-28 08:43 |只看该作者
面试题应该不会出这种题,这个好像c语言未定义的,根据编译器的不同可能有不同的值

论坛徽章:
0
42 [报告]
发表于 2008-07-28 11:14 |只看该作者
同一个语句中对一个变量2次赋值在C语言是未定义的。同意41楼。

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
43 [报告]
发表于 2008-07-28 12:44 |只看该作者
路过看下

论坛徽章:
0
44 [报告]
发表于 2008-07-28 12:47 |只看该作者
(x++)+2
5       +2
根本不用搞的那么复杂

论坛徽章:
0
45 [报告]
发表于 2008-07-28 17:00 |只看该作者
int x = 5;
x = x+++2;


我的理解:
在执行x = x+++2;语句时:取x的值5加2等于7
当表达式执行完后,由于x变量有一个后增运算,还需要加1,所以最终结果是:取x的值7再加1等于8

我觉得这种题目没有意义,实际的软件开发中是不会写出这种语句的,可读性很差,而且不同的编译环境得出的结果还不一样

论坛徽章:
0
46 [报告]
发表于 2008-07-28 23:43 |只看该作者
原帖由 zeus82 于 2008-7-24 09:32 发表
int x = 5;
x = x++
结果是x = 5,我看到的一个解释是先把寄存器中x的值放回内存,然后寄存器中的值加1,所以内存中的x还是原来的值。
但下面这个我就不明白了
int x = 5;
x = x+++2;
结果是x = 8,其执行 ...



++运算符优先级高于+运算,
x+++2 = (x++) + 2 = 6 + 2 =8

论坛徽章:
0
47 [报告]
发表于 2008-07-28 23:45 |只看该作者
int x = 5;
x = x++
结果是x = 5,我看到的一个解释是先把寄存器中x的值放回内存,然后寄存器中的值加1,所以内存中的x还是原来的值。
但下面这个我就不明白了
int x = 5;
x = x+++2;
结果是x = 8,其执行过程我觉得应该是将寄存器中的x加2然后放回内存,最后寄存器中的值加1,没有放回内存就像上面一样,结果应该为7啊。

谁能给详细的讲解一下呢?

0x08048391 <main+17>:    movl   $0x5,-0xc(%ebp)   // int x =5;
0x08048398 <main+24>:    incl   -0xc(%ebp)         // x = x++;
0x0804839b <main+27>:    movl   $0x5,-0xc(%ebp)  // x = 5;
0x080483a2 <main+34>:    addl   $0x2,-0xc(%ebp)  
0x080483a6 <main+38>:    incl   -0xc(%ebp)         // x = x++ + 2;

所以楼主看到的解释是胡说八道。
x = x++; => x = x, x = x + 1;
x = x++ + 2; => x = x + 2, x = x + 1;

论坛徽章:
0
48 [报告]
发表于 2008-07-28 23:59 |只看该作者
假如 whyglinux 版主看到这个帖子,他一定会耐心、细致地告诉你,这是无定义操作。
在某个表达式当中对同一个变量做两次或两次以上的运算,变量的值是无定义的。
所有的讨论都只是猜测,是站在自己的角度进行的设想。

[ 本帖最后由 langue 于 2008-7-29 00:00 编辑 ]

论坛徽章:
0
49 [报告]
发表于 2008-07-29 00:00 |只看该作者
这么多人,一起月经?

论坛徽章:
0
50 [报告]
发表于 2008-07-29 00:01 |只看该作者
大家应该是在做纯学术讨论.

[ 本帖最后由 system888net 于 2008-7-29 00:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP