| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 883 人关注过本帖
标题:两个小问题.
只看楼主 加入收藏
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
 问题点数:0 回复次数:8 
两个小问题.
1.i=(j++,k++); 为什么先把没有加一的k赋给i?
不是先运算括号里的逗号运算符吗?再把k+1的数赋给i吗?
2.#define CUBE(x) (x*x*x)
在主函数中 x=5; y=CUBE(++x); 是怎样展开(x*x*x)的
搜索更多相关主题的帖子: 函数 
2008-10-23 12:14
zxwangyun
Rank: 4
来 自:云南
等 级:业余侠客
威 望:1
帖 子:232
专家分:299
注 册:2008-10-17
收藏
得分:0 
1、
j++,k++;
为逗号表达式,但是++是在k后面的啊
2、
y=(++x)*(++x)*(++x);
2008-10-23 12:47
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
1.因为逗号在括号里 先运算这时候就是k本身 等逗号运算完后 k+1 该把k+1的值赋给i的吧
2.当然知道是y=(++x)*(++x)*(++x); 我是想问 展看后的运算式是y=7*8*9 还是什么样子的?
2008-10-23 12:58
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
当然知道是y=(++x)*(++x)*(++x); 我是想问 展看后的运算式是y=7*8*9 还是什么样子的?
说实话这跟编译器有关,有的是统一++之后再算的。
根据语法来说7*8*9合理点。

倚天照海花无数,流水高山心自知。
2008-10-23 13:16
keanbin
Rank: 1
等 级:新手上路
威 望:1
帖 子:26
专家分:0
注 册:2007-10-11
收藏
得分:0 
奇怪 我这边运行得出来的数是:392
我是觉得好像应该是6*7*8吧!!!
2008-10-23 14:26
lmyouya
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-10-17
收藏
得分:0 
两个小问题.
问题1:
i=(j++,k++)  <==>  {j++;i=k;k++}

2.#define CUBE(x) (x*x*x)
在主函数中 x=5; y=CUBE(++x); 是怎样展开(x*x*x)的

VC++ 6.0 Debug版本的展示开过程:
程序代码:
6:        int x,y;
7:        x=5;
00401578   mov         dword ptr [ebp-4],5        ;x=5
8:        y=CUBE(++x);
0040157F   mov         eax,dword ptr [ebp-4]      ;eax=x      //eax=5 x=5
00401582   add         eax,1                      ;eax=eax+1  //eax=6
00401585   mov         dword ptr [ebp-4],eax      ;x=eax      //x=6
00401588   mov         ecx,dword ptr [ebp-4]      ;ecx=x      //ecx=6
0040158B   add         ecx,1                      ;ecx=ecx+1  //ecx=7
0040158E   mov         dword ptr [ebp-4],ecx      ;x=ecx      //x=7
00401591   mov         edx,dword ptr [ebp-4]      ;edx=x      //edx=7
00401594   imul        edx,dword ptr [ebp-4]      ;edx=edx*x  //edx=7*7=49
00401598   mov         eax,dword ptr [ebp-4]      ;eax=x      //eax=7
0040159B   add         eax,1                      ;eax=eax+1  //eax=8
0040159E   mov         dword ptr [ebp-4],eax      ;x=eax      //x=8
004015A1   imul        edx,dword ptr [ebp-4]      ;edx=edx*x  // edx=49*8=392
004015A5   mov         dword ptr [ebp-8],edx      ;y=edx      //y=392
9:        cout<<y<<endl;
004015A8   push        offset @ILT+195(std::endl) (004010c8)
004015AD   mov         ecx,dword ptr [ebp-8]
004015B0   push        ecx
004015B1   mov         ecx,offset std::cout (0047be90)
004015B6   call        @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)

吖吖走了
2008-10-23 14:57
lmyouya
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-10-17
收藏
得分:0 
问题2:
VC++6.0 Release 版的过程汇编代码:
很有趣!
程序代码:
00401002  |.  68 00020000   push    200
00401007  |.  B9 E87C4100   mov     ecx, 00417CE8
0040100C  |.  E8 5F000000   call    00401070


那里有趣呢?
很到一个:
00401002  |.  68 00020000   push    200
吗?
0x200=512=8*8*8
它是在编译程序的时候就对代码进行了优化,提高程序的运行速度。

吖吖走了
2008-10-23 15:06
lmyouya
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-10-17
收藏
得分:0 
再来看个DEV C++ 5的生成的代码:

程序代码:
004013BA  |.  C745 FC 05000>mov     dword ptr [ebp-4], 5             //x=5
004013C1  |.  8D45 FC       lea     eax, dword ptr [ebp-4]           //eax=&x *eax=5
004013C4  |.  FF00          inc     dword ptr [eax]                  //*eax=*eax+1 *eax=6
004013C6  |.  8D45 FC       lea     eax, dword ptr [ebp-4]           //eax=&x     *eax=6
004013C9  |.  FF00          inc     dword ptr [eax]                  //*eax=*eax+1 *eax=7
004013CB  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           //eax=&x     *eax=7
004013CE  |.  89C2          mov     edx, eax                         //edx=*eax   edx=7
004013D0  |.  0FAF55 FC     imul    edx, dword ptr [ebp-4]           //edx=edx*x=7*7=49
004013D4  |.  8D45 FC       lea     eax, dword ptr [ebp-4]           //eax=&x  *eax=7
004013D7  |.  FF00          inc     dword ptr [eax]                  //*eax=*eax+1 *eax=8 x=8
004013D9  |.  89D0          mov     eax, edx                         //eax=edx   eax=49
004013DB  |.  0FAF45 FC     imul    eax, dword ptr [ebp-4]           //eax=eax*x eax=49*8=392
004013DF  |.  8945 F8       mov     dword ptr [ebp-8], eax           //y=eax y=392


PS:
笨笨的,注释写错了莫怪吖!
呼呼!


恩恩,想想:
问题最后生成的结里,要看生成程序的编译器对代码的代理和优化。
弱弱的吖吖,希望吖吖自己在实际编程中不会出现这样结果有异的程序。

吖吖走了
2008-10-23 15:34
huxiangking
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2008-10-23
收藏
得分:0 
看不懂代码诶~
2008-10-23 20:05
快速回复:两个小问题.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037288 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved