鱼C论坛

 找回密码
 立即注册
查看: 2463|回复: 9

各位牛人们 麻烦解释下这几个程序 谢谢了

[复制链接]
发表于 2011-12-1 15:22:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include "stdio.h"
void main()
{
                 int a,b = 322;
        float x,y = 8.88;
        char c1 = 'k',c2;
        a = y;
        x = b;
        a = c1;
        c2 = b;
        printf("%d,%f,%d,%c\n",a,x,a,c2);

}


#include <stdio.h>
void main ()
{
    int        i =5,j = 5,p,q;
        p = (i++)+(i++)+(i++);
        q = (++j)+(++j)+(++j);
        printf("%d,%d,%d,%d",p,q,i,j);

}

这个是甲鱼哥视频教程里面的程序,望大家不吝赐教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 18:08:32 | 显示全部楼层
#include "stdio.h"     
void main()           
{                上面就不解释了
                 int a,b = 322;  声明 整型变量 a 和b,  并给b赋值322
        float x,y = 8.88;      声明  浮点型变量 x和u,并给y进行赋值8.88
        char c1 = 'k',c2;    声明  字符型变量 c1和c2 ,并给c1赋值 ‘k’
        a = y;              把y的值给a(这里要注意类型的转化 要抛弃掉小数点后面的数)
        x = b;             把b的值给x
        a = c1;           把c1的值给a(但是c1是字符型的 照这样写的话好像是吧c1中字符的asc码给a【好长时间没用c了见谅】)
        c2 = b;          这里就是把b中的值322给c2 (这里还是类型的问题,这里是把322作为asc码转为字符给c2)
        printf("%d,%f,%d,%c\n",a,x,a,c2);  最后就是打印了(%d 这个是以数值类型输出,%f是以浮点类型输出 也就是小数,%c就是以字符类型输出)一一对应之后就是 a以数值类型输出,x以字符类型输出,a以数值类型输出,c2以字符类型输出; \n就是换行的意思

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 18:15:24 | 显示全部楼层
这个貌似有点麻烦 因为看到过甲鱼老师说道过 vs编译器的问题  貌似有个什么优化,这个其实也不懂啦 所以努力学汇编中   来看看到底是怎么回事  ,我就按正常运行来解释
#include <stdio.h>
void main ()
{
    int        i =5,j = 5,p,q;      这边就不说了 跟上面一样
        p = (i++)+(i++)+(i++);      
i++是先执行在++所以找我的理解应该是 p=5+6+7;最后 i=8;
        q = (++j)+(++j)+(++j);
++j是先++再执行 所以我理解为 q=6+7+8;最后j=8;
        printf("%d,%d,%d,%d",p,q,i,j);
然后是输出 应该是 18,21,8,8
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 18:16:00 | 显示全部楼层
若有错误,请指正 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 18:16:56 | 显示全部楼层
第一个是赋值问题。。。a最终是由c1的值决定的,k也就是ASCLL码的107.x就是由b赋予的,值得注意的是前面的都是以整数形式打印的,而c2要以字符形式打印。。
第二个就是自增自减问题。。i++就是先使用i然后自加1,++i就刚好相反,。,。,。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 20:07:43 | 显示全部楼层
楼上已经说的很详细了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 23:39:01 | 显示全部楼层
楼上错了,不信上机实践下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-1 23:52:02 | 显示全部楼层
我来解释一下吧
     p = (i++)+(i++)+(i++);
        q = (++j)+(++j)+(++j);
        printf("%d,%d,%d,%d",p,q,i,j);

输出 应该是 18,22,8,8    疑问都集中在q的值上
反汇编后是这样,我注释写得简单些让大家都能看懂

6:            q = (++j)+(++j)+(++j);
0040D4FD   mov         ecx,dword ptr [ebp-8]        ;    j=[ebp-8]=(ecx)=5
0040D500   add         ecx,1                                ;       (ecx)=6
0040D503   mov         dword ptr [ebp-8],ecx        ;   [ebp-8]=(ecx)=6
0040D506   mov         edx,dword ptr [ebp-8]       ;    [ebp-8]=(edx)=6
0040D509   add         edx,1                               ;     (edx)=7
0040D50C   mov         dword ptr [ebp-8],edx       ;    [ebp-8]=(edx)=7
0040D50F   mov         eax,dword ptr [ebp-8]       ;     [ebp-8]=(eax)=7
0040D512   add         eax,dword ptr [ebp-8]        ;     (eax)=[ebp-8]+(eax)=14
0040D515   mov         ecx,dword ptr [ebp-8]       ;     [ebp-8]=(ecx)=7
0040D518   add         ecx,1                               ;     (ecx)=8
0040D51B   mov         dword ptr [ebp-8],ecx        ;    [ebp-8]=(ecx)=8
0040D51E   add         eax,dword ptr [ebp-8]         ;    (eax)=(eax)+[ebp-8]=14+8=22
0040D521   mov         dword ptr [ebp-10h],eax     ;    q=[ebp-10h]=(eax)=22

这就是为什么是22而不是21的原因。。。vc++就是在这里搞的鬼。嘿嘿。还有什么问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-2 15:46:45 | 显示全部楼层
都是牛人啊 唉 都对了 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-2 15:53:53 | 显示全部楼层
不好意思 前面回复错了     第一个运行的结果 107,322.000000,107,B 这个107 和B 不懂哦
第二个是  15,22,8,8.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 02:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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