被妹子问倒了
#include "stdio.h"void main()
{
intx=1,y,z;
y=(++x)*(++x);
printf("%d",y);
}
为什么是9,不是6
本帖最后由 wo940417 于 2014-8-26 22:05 编辑
因为++x(其实就是变量 _ _X),指向的是同一个指针(地址)假设为1000:0000,那么一开始++x,那么1000:0000代表的数值就变2,然后++x,继续+1,变为3.此时这个地址代表的_ _x,进行x*x运算,算得9~~应该是这样。本人菜鸟~ 第一次++x结果x为2,然后在次++x,那就是3了,3*3不就是9了, 主要是两个++x,别忘了他们都是同一个变量。 看来你的基础得加强啊。编程的魅力之一就是可以在妹纸前炫耀一下。 路过
三楼说的不错,哈哈~
可惜我刚毕业了,怀恋学校时光 x_Daniel 发表于 2014-8-25 21:29
第一次++x结果x为2,然后在次++x,那就是3了,3*3不就是9了, 主要是两个++x,别忘了他们都是同一个变量。
一楼正解 我又长见识了:lol: 这个看编译器的.
不要纠结于这些内容,我们要当程序员,不是语言专家~ 这种每个星期至少有人问一次的问题又出现了。。。真心不明白为什么遇到问题总觉得世界上自己是第一个遇到这个问题的人?为什么不baidu一下呢? 什么样的妹子,总是给哥哥出难题,你把她的电话给我,我骂他一顿 本帖最后由 ♂情︵☆缘★ 于 2014-8-26 21:03 编辑
这应该得6吧 结果无定义
乘法操作符本身不保证是左操作数先被求值还是右边先被求值
问这个是没有意义的
具体结果还得看编译器 一楼正解,不过也学到点了 我理解 ++x 是先自增再参与运算 所以两次+1之后 x == 3;3 * 3 == 9{:1_1:} 看编译器吧
5: int i = 1, n;
00401028 mov dword ptr ,1
6:
7: n = (++i) * (++i);
0040102F mov eax,dword ptr //把1传给AX
00401032 add eax,1//eax = eax +1,加一在传给Ax结果为2
00401035 mov dword ptr ,eax
00401038 mov ecx,dword ptr //再将2传给CX
0040103B add ecx,1//cx+1传给cx,结果为3
0040103E mov dword ptr ,ecx
00401041 mov edx,dword ptr //再将3传给dx,dx为3
00401044 imul edx,dword ptr //3乘3传给dx
00401048 mov dword ptr ,edx//j结果9
8:
9: printf ("%d\n", n);
0040104B mov eax,dword ptr
通过上面的反汇编可以很清楚的看到!!!
我又长见识了 妹子漂亮吗?