明解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);
因为分数是程序运行时输入的,bunpu[10]是不是2无法预知,从程序运行时打印出一个*来看,你确认输入的不是一个100分?本回答被提问者采纳
如何提高C语言代码质量?
关注“嵌入式软件学习圈”免费获取更多学习教程
小心使用无符号类型带来的陷阱
有过面试经历的同学可能曾碰到如代码清单所示的问题。
对代码清单进行初步分析可以得出,sizeof(array) 的返回结果为24,而i的值为-1,因此执行语句“if( i <= sizeof(array))”所返回的结果应该为true,即输出结果为“i<=sizeof(array)”。但实际情况并非如此,其输出结果如图所示。
那么,究竟是什么原因导致出现这样的输出结果呢?
其实,要回答这个问题并不难。我们知道sizeof()的返回结果是size_ t类型,而size_t类型是一种无符号整数类型。当有符号整数类型和无符号整数类型进行运算时,有符号整数类型会先自动转化成无符号整数类型(请特别注意这--点)。
因此,在代码清单中,当i与sizeof(array)进行比较时,即执行语句“if( i <=sizeof(array))", i 会自动升级为无符号整数类型。又因为i的值为-I,在它转换为无符号整数类型后就变成-一个非常大的正整数(如-1在32位机器上存储为0xffffff而它被解释为无符号整数时就是4294967295 ),远远大于sizeof(array)的返回结果24。
为了加深读者的理解,我们再来看代码清单1-7 所示的这个例子。
在代码清单中,当执行语句“a-b”时,变量a会自动由int类型转换为unsigned int类型,再与变量b执行减法运算(即“a-b"),“a-b"的运算结果为0xffffffff。
当程序使用“%d”(有符号十进制整数)格式输出时,0xffffffff被转换为-1 ;
当程序使用“%u”(无符号十进制整数)格式输出时,0xffffffff 被转换为4294967295 ;
最后,程序执行“0xffffffff>>1”运算时,其运算结果为0x7fffffff。 当程序使用“%d"(有符号十进制整数)格式输出时,0x7ffffff被转换为2147483647。如图所示。
由上面两个例子可以看出,将有符号类型与无符号类型混合使用是很危险的。
因此,我们一定要小心这个数据转换陷阱,尽量少在代码中使用无符号类型,以免增加不必要的复杂性。尤其是不要仅仅因为无符号数不存在负值而用它来表示某些数量(如年龄、人口等无负数的值)。
建议尽量使用像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语言第三版 入门篇 练习题答案 第六章 第6-11题解法。函数相关的问题。