鱼C论坛

 找回密码
 立即注册
查看: 2793|回复: 13

初学的几个小问题

[复制链接]
发表于 2012-5-28 11:23:15 | 显示全部楼层 |阅读模式
10鱼币
int    j=5, p
p = (++j)+(++j)+(++j);
printf("%d", p);

结果是几? 我算的是21呢,就是6+7+8,可是运行后显示22,求解~~

  int a=2, b=4, c=6, x, y;
y=(x=a+b), (b+c);
printf("y=%d, x=%d",y, x);

这里是讲逗号的运算时的一个例题,我算的结果是y=10,x=6,运行后显示y也为6,求解~~~

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", a, x, a, c2);

运行结果是107, 322.00000, 107, B。 求解a和c2的值~~~~

最佳答案

查看完整内容

第三题 因为a=c1,是把'K'的ASCII码赋给a,即107. c2 = b,这个要注意,因为char类型的范围是-128~127,而b为322,溢出了, 322的二进制码是101000010,由于char类型的限制,只能赋给,c2低八位, 即01000010,值为66,换成字符就是'B'.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-28 11:23:16 | 显示全部楼层
第三题
因为a=c1,是把'K'的ASCII码赋给a,即107.
c2 = b,这个要注意,因为char类型的范围是-128~127,而b为322,溢出了,
322的二进制码是101000010,由于char类型的限制,只能赋给,c2低八位,
即01000010,值为66,换成字符就是'B'.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-28 11:58:58 | 显示全部楼层
第一题

p = (++j)+(++j)+(++j);反编译如下:

0040FCDF   mov         eax,dword ptr [ebp-4]
0040FCE2   add         eax,1
0040FCE5   mov         dword ptr [ebp-4],eax
0040FCE8   mov         ecx,dword ptr [ebp-4]
0040FCEB   add         ecx,1
0040FCEE   mov         dword ptr [ebp-4],ecx
0040FCF1   mov         edx,dword ptr [ebp-4]
0040FCF4   add         edx,dword ptr [ebp-4]
0040FCF7   mov         eax,dword ptr [ebp-4]
0040FCFA   add         eax,1
0040FCFD   mov         dword ptr [ebp-4],eax
0040FD00   add         edx,dword ptr [ebp-4]
0040FD03   mov         dword ptr [ebp-8],edx
编译器是j先自加了两次,这是j等于了7,然后7+7=14,
把值保存起来,j再自加变成8,然后14+8=22,把值保存起来。
至于编译器为什么这么做就涉及到编译原理了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-28 12:02:04 | 显示全部楼层
第二题是因为逗号运算符优先级小于赋值运算符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-28 17:06:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-28 17:37:13 | 显示全部楼层
Believe 发表于 2012-5-28 17:06
是啊,这样的话最后y就等于b+c了,y=b+c不就等于6吗?

不是的,因为逗号运算符优先级小于赋值运算符
x = (a+b)的值赋给y了,逗号后面的b+c不会赋给y啊...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-28 18:38:53 | 显示全部楼层
char   c1='k';
a=c1;
因为a为int类型,所以a存放是字符'k'的ascii码,通过查ascii码表得到字符'k'的ascii码是107

322的2进制表示是:101000010,一共9位2进制,char只能存放8位2进制,所以抛弃最高位
所以char c2=b;c2存放的数值是二进制01000010,也就是10进制的66.查ascii码表知道66代表字符B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-28 18:41:38 | 显示全部楼层
第一题的结果是编译器相关的(在不同的C编译器下有不同的结果),这种题目主要目的是告诉你出题目的人有多搓,以及提醒自己以后不要写出类似让人鄙视的代码。

第2题,逗号的优先级低于赋值运算符,结果自己再想想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-28 21:15:58 | 显示全部楼层
仰望天上的光 发表于 2012-5-28 18:41
第一题的结果是编译器相关的(在不同的C编译器下有不同的结果),这种题目主要目的是告诉你出题目的人有多搓 ...

thank you ~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-28 21:22:48 | 显示全部楼层
混脸熟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-29 10:49:48 | 显示全部楼层
我也学到这里了  都快被绕晕了!  问下啊  printf("y=%d, x=%d",y, x);
中  那个 y=%d x=%d  到底啥意思啊 !有点模糊的明白可又不完全理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-29 13:24:10 | 显示全部楼层
zhuyudi 发表于 2012-5-29 10:49
我也学到这里了  都快被绕晕了!  问下啊  printf("y=%d, x=%d",y, x);
中  那个 y=%d x=%d  到底啥意思啊 ...

首先,在printf输出时,引号中的内容全为输出的内容;
其次,“%”号“\”等与字母或其他符号组成的元素是输出它们所代表的内容,比如在这里“%d”代表的是一个整数,而这个整数就是在引号后面与之顺序对应的内容。
假如前面运算出来y为6.7,y=%d就是显示“y=6“。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-29 21:23:20 | 显示全部楼层
关于第一题看这个贴http://bbs.fishc.com/thread-15954-1-1.html,包懂,我也是看过后才明白了自增自减的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-3 13:10:32 | 显示全部楼层
肖凯文kevin 发表于 2012-5-29 21:23
关于第一题看这个贴http://bbs.fishc.com/thread-15954-1-1.html,包懂,我也是看过后才明白了自增自减的

果然不错,讲的很清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-26 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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