各位朋友你们好!
我是个新手,C语言上有个新问题想请教一下,谢谢了!问题如下:
设a=1,b=2,c=3,d=4,则表达式: a<b?a: c<d?a: d的结果为( )。
我想知道这题的解析过程??谢谢大家帮忙!
[此贴子已经被忆楠于2004-10-01 22:41:05编辑过]
惭愧啊,最近实在太忙了,回答的问题都是敷衍了事,真是对不起大家!在此向大家道歉~~你没理解是我没讲清楚~此乃寡人之过也~
好,现在我们来解决第一个问题:
设a=1,b=2,c=3,d=4,则表达式: a<b?a: c<d?a: d的结果为
解析: a=1,b=2,c=3,d=4 这是程序一开始就赋的初值 因为<的优先级别要比?:的优先级要高,所以程序先运算a<b 和 c<d,所以
a<b?a:c<d?a:d 就变为: 1?a:1?a:d
继续。因为?: 与 ?:是同一优先级,根据运算时从左到右的原则,表达式继续变为: (1?a:1)?a:d => a?a:d => a
所以表达式子最终的结果就是 a,也就是1啦
第二个问题:
你的题目少打一个d吧?我想应该是 printf("%d\n",x--); 才有答案符合
0xffff是个十六进制的数据,转换成无符号的整形变量(%ud)就是65535 转换成有符号的整形变量(%d)就是-1
原因:因为有符号整形变量的范围是:-32768~+32767 如果超过了范围将会从另一头溢出,也就是从另一头开始。比如:32767+1 你也许会认为答案是32768,但是实际上因为32768超过了变量的最大值,他将会从最小值溢出,所以你将会得到的答案是-32768
同理,0xffff转成 %ud 的值为65535,肯定超过了 %d 的范围,所以他将会溢出,然后从-32768开始算起。所以结果为-1。
你听明白了吗?我想也许我讲得还不够很详细,如果还不明白,继续问,我会一一解答。
附:学C没捷径,指针最关键。
谢谢这位c高手帮我这样一一的详解真是麻烦了。
第一道题我看懂了非常感谢!!
不好意思,第二道却实是少了一个d ,但还是看不懂。
(1)在这个问题上 0xFFFF是怎样转成65535的?为什么是65535而不是0~65535之间的数?
(2)然后有符号整型变量好像是-32767~+32767 (我从书上看的,不过好像我这书真是垃圾,许多解析都是错的)。
关于溢出的问题我看懂了。
(3) 但( 0xffff转成 %ud 的值为65535,肯定超过了 %d 的范围,所以他将会溢出,然后从-32768开始算起。所以结果为-1)?无符号整型的变量是从0~65535的啊 ,为什么从-32768开始算呢?是怎样算到-1的呢?
望指点,谢谢!
哦~~数据在硬盘上的最终存储形态是0101010101010111之类的,这个叫做二进制度。但是二进制实在是太麻烦了,于是我们就用十进制、十六进制等等来表示这些数。
[1] x0ffff就正是一个十六进制数,但为什么0XFFFF转成无符号整形就变成65535了呢?这个我自己是明白的,但是表达能力有限,说不出~~
当然,你也可以自己编写个程序 main() { int a; scanf("%d",&a); /*输入一个十进制数值*/ printf("<10> %d\n",a); /*转换成一个有符号十进制数值*/ printf("<Unsign10> %ud\n",a); /*转换成一个有符号十进制数值*/ printf("<16> 0x%x\n",a); /*转换成一个十六进制数值*/ getch(); }
[2] 有符号的整形变量的范围是-32768~+32767 你的书上是错误的!
[3] 哦,我说得不够清楚。这题的转换我为了让你看清楚,是这样转的:
十六进制 =》 无符号十进制 =》 有符号十进制 0xffff => 65535 => -1
65535已经超过了有符号的上限+32767,所以要发生溢出
[此贴子已经被作者于2004-08-08 10:13:00编辑过]