明解C语言的代码清单5-13看不明白

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了明解C语言的代码清单5-13看不明白相关的知识,希望对你有一定的参考价值。

求大神帮我解释一下这一行的意思:
for (j = 0; j < bunpu[10]; j++)
putchar('*');
这个bunpu[10]应该是2对吗,为什么只打印了一个* ????

#define _CRT_SECURE_NO_WARNINGS 1

/*

输入学生的分数并显示出分布情况

*/

#include <stdio.h>

#include<stdlib.h>

#define NUMBER 80 // 人数上限

int main(void)



int i, j;

int num; // 实际的人数

int tensu[NUMBER]; // 学生的分数

int bunpu[11] = 0 ; // 分布图

printf("请输入学生人数:");

do

scanf("%d", &num);

if (num < 1 || num > NUMBER)

printf("\a人数范围[1到%d] :", NUMBER);

while (num < 1 || num > NUMBER);

puts("请输入学生的分数。");

for (i = 0; i < num; i++)

printf("%2d号:", i + 1);

do

scanf("%d", &tensu[i]);

if (tensu[i] < 0 || tensu[i] > 100)

printf("\a分数范围[0到100]:");

while (tensu[i] < 0 || tensu[i] > 100);

bunpu[tensu[i] / 10]++;



puts("\n----分布图----");

printf(" 100:");

for (j = 0; j < bunpu[10]; j++)

putchar('*');

putchar('\n');

for (i = 9; i >= 0; i--)

printf("%3d - %3d:", i * 10, i * 10 + 9);

for (j = 0; j < bunpu[i]; j++)

putchar('*');

putchar('\n');



system("pause");
return (0);

参考技术A bunpu[10]存放的是你输入100分的个数,也是将要打印*的个数。
因为分数是程序运行时输入的,bunpu[10]是不是2无法预知,从程序运行时打印出一个*来看,你确认输入的不是一个100分?本回答被提问者采纳

如何提高C语言代码质量?

关注“嵌入式软件学习圈”免费获取更多学习教程 

小心使用无符号类型带来的陷阱

有过面试经历的同学可能曾碰到如代码清单所示的问题。

如何提高C语言代码质量?(四)

如何提高C语言代码质量?(四)

对代码清单进行初步分析可以得出,sizeof(array) 的返回结果为24,而i的值为-1,因此执行语句“if( i <= sizeof(array))”所返回的结果应该为true,即输出结果为“i<=sizeof(array)”。但实际情况并非如此,其输出结果如图所示。

如何提高C语言代码质量?(四)

那么,究竟是什么原因导致出现这样的输出结果呢?

其实,要回答这个问题并不难。我们知道sizeof()的返回结果是size_ t类型,而size_t类型是一种无符号整数类型。当有符号整数类型和无符号整数类型进行运算时,有符号整数类型会先自动转化成无符号整数类型(请特别注意这--点)。

因此,在代码清单中,当i与sizeof(array)进行比较时,即执行语句“if( i <=sizeof(array))", i 会自动升级为无符号整数类型。又因为i的值为-I,在它转换为无符号整数类型后就变成-一个非常大的正整数(如-1在32位机器上存储为0xffffff而它被解释为无符号整数时就是4294967295 ),远远大于sizeof(array)的返回结果24。

为了加深读者的理解,我们再来看代码清单1-7 所示的这个例子。

如何提高C语言代码质量?(四)

在代码清单中,当执行语句“a-b”时,变量a会自动由int类型转换为unsigned int类型,再与变量b执行减法运算(即“a-b"),“a-b"的运算结果为0xffffffff。

当程序使用“%d”(有符号十进制整数)格式输出时,0xffffffff被转换为-1 ;

当程序使用“%u”(无符号十进制整数)格式输出时,0xffffffff 被转换为4294967295 ;

最后,程序执行“0xffffffff>>1”运算时,其运算结果为0x7fffffff。 当程序使用“%d"(有符号十进制整数)格式输出时,0x7ffffff被转换为2147483647。如图所示。

如何提高C语言代码质量?(四)

由上面两个例子可以看出,将有符号类型与无符号类型混合使用是很危险的。

因此,我们一定要小心这个数据转换陷阱,尽量少在代码中使用无符号类型,以免增加不必要的复杂性。尤其是不要仅仅因为无符号数不存在负值而用它来表示某些数量(如年龄、人口等无负数的值)。

建议尽量使用像int这样的类型,这样在设计升级混合类型的复杂细节时,就不必担心边界情况了(比如不用担心-1被翻译为非常大的正整数)。如果必须使用无符号类型,则应该在表达式中使用强制类型转换,使操作数均为有符号类型或者无符号类型,这样就不必由编译器来选择结果的类型,从而避免存在潜在错误的可能性。比如,我们可以通过强制转换将代码清单改写为代码清单。

在代码清单中,我们将语句“if(i<= sizcofarray))”改成“if( i <= (int)sizeofarry))",也就是通过强制类型将其转换成int类型,因而程序的输出结果为i <= sizeof(array)。






如何提高C语言代码质量?历史消息






汽车电子入门历史消息

汽车电子控制技术入门(十) 主要讲述:ECU硬件软件的开发流程,以及控制过程包括:开环,闭环控制,链接为:


汽车电子控制技术入门(九) 主要讲述:氧传感器功用, 氧传感分类氧化锆(ZrO2)氧化钛(TiO2)氧化锆式氧传感器和氧化钛式氧传感器 工作原理,链接为:


汽车电子控制技术入门(八) 主要讲述:电子控制系统的组成、曲轴位置传感器工作原理、凸轮轴位置传感器(磁感式、霍尔式、光电式)工作原理,链接为:


汽车电子控制技术入门(七) 主要讲述:电动燃油泵、燃油分配管、燃油压力调节器、喷油器等组成以及其工作原理 链接为:


汽车电子控制技术入门(六) 主要讲述:燃油供给系统的组成、电动燃油泵的工作原理。链接为:


汽车电子控制技术入门(五) 主要讲述:温度传感器的组成分类,以及工作原理。链接为:


汽车电子控制技术入门(四) 主要讲述:空气式流量传感器的分类以及工作原理,节气门位置传感器的组成和工作原理。链接为:


汽车电子控制技术入门(三) 主要讲述:发动机电子控制系统,电子控制燃油喷射系统的分类和基本组成,空气供给系统的组成和工作原理。链接为:


汽车电子控制技术入门(二) 主要讲述:汽车电子控制技术的发展趋势,1、控制系统集成化,2、信息传输网络化,3、汽车和交通智能化,4、电控系统设计模块化,以及介绍了汽车电控系统的基本组成:传感器、执行器、ECU.链接为:


汽车电子控制技术入门(一) 主要讲述:汽车电子控制技术的发展,以及三个发展阶段:模拟电子电路阶段,微型计算控制阶段,车载局域网控制阶段。链接为:




 

 


以上是关于明解C语言的代码清单5-13看不明白的主要内容,如果未能解决你的问题,请参考以下文章

明解c语言 13-4

明解C语言第三版入门篇,do语言练习4-2答案,求大神

明解c语言第三版 入门篇 练习题答案 第六章 第6-11题解法。函数相关的问题。

读bmp图片:头文件为66字节。。。怎么用c语言来读取数据啊,网上的代码我看不懂。新手,希望能写明白些

一段c语言代码看不懂,请各位指教!

c语言的杨辉三角程序