作为一个老程序员,我说一些教材上没有重视的东西(对于各位的代码是否正确没有必要说,上机调试一下就知道了):
1.2楼的问题在于一个函数的内容没有做到内聚性强,在prime()函数中聚焦了三个功能,判素数、计数和求累加和。编码规范要求一个函数就完成一个功能。另外没有考虑完整性,当被判断整数为0、为1、甚至为负数时会怎样。
2.4楼的问题在于小细节:a。IfPrime()函数的命名应该为isPrime(),这样就和返回类型bool概念一致了。b.考虑了形参为1的情况,但是为0呢?c.判素数的循环有冗余,循环终值为sqrt(iNum)+1即可。d.prime()函数中true==IfPrime(...)的判断属于一种多余,因为IfPrime()的返回值就是一个bool值(请看看林锐博士的高质量程序设计一书)。e.函数功能的单一性(内聚性),输出值的内容不应该在prime()函数中完成。
3.5楼的代码中有一个程序员大忌,“一定不要返回局部变量的指针!”,p[2]是函数的局部变量,返回p即数组首址,函数结束时,局部变量的存储空间是要被收回的(生命周期已结束),在上一层函数中用指针访问被收回的空间数据是一种不可宽恕的问题,尽管你是在返回上一层函数后立即访问,这个空间还没有再次使用。作为一种编码规范,一定不要养成这个习惯。
4.7楼是LZ吧,有进步了,但prime()函数中的flag变量的命名不规范(教材上就是这样写的,是吧),这个flag是标志的统称,在表示一个算法时可以表明一种方法,但在具体的代码中应该写一个意义更明确的名字如isprime(本身带有一种假定--需要证实),isprime=1;表示确定;isprime=0;表示否定。或者将这个if语句与return语句合并:return (j>sqrt(i))?1:0.不过这里有另一个话题,这个结构不太好,因为否定的结论在for循环中就已经得到了,在循环结束后用j>sqrt(i)的间接证实属于不当行为(是不是教材上就是这样写的呀?)
以上的说法是我作为一个软件公司的考官时,对考生的忠告:不要以教材上的代码作为自己的学习范例--应该看看编码规范了(网上能找到)如林锐的C/C++高质量程序设计,华为编程规范、中兴软件编程规范等。
1.2楼的问题在于一个函数的内容没有做到内聚性强,在prime()函数中聚焦了三个功能,判素数、计数和求累加和。编码规范要求一个函数就完成一个功能。另外没有考虑完整性,当被判断整数为0、为1、甚至为负数时会怎样。
2.4楼的问题在于小细节:a。IfPrime()函数的命名应该为isPrime(),这样就和返回类型bool概念一致了。b.考虑了形参为1的情况,但是为0呢?c.判素数的循环有冗余,循环终值为sqrt(iNum)+1即可。d.prime()函数中true==IfPrime(...)的判断属于一种多余,因为IfPrime()的返回值就是一个bool值(请看看林锐博士的高质量程序设计一书)。e.函数功能的单一性(内聚性),输出值的内容不应该在prime()函数中完成。
3.5楼的代码中有一个程序员大忌,“一定不要返回局部变量的指针!”,p[2]是函数的局部变量,返回p即数组首址,函数结束时,局部变量的存储空间是要被收回的(生命周期已结束),在上一层函数中用指针访问被收回的空间数据是一种不可宽恕的问题,尽管你是在返回上一层函数后立即访问,这个空间还没有再次使用。作为一种编码规范,一定不要养成这个习惯。
4.7楼是LZ吧,有进步了,但prime()函数中的flag变量的命名不规范(教材上就是这样写的,是吧),这个flag是标志的统称,在表示一个算法时可以表明一种方法,但在具体的代码中应该写一个意义更明确的名字如isprime(本身带有一种假定--需要证实),isprime=1;表示确定;isprime=0;表示否定。或者将这个if语句与return语句合并:return (j>sqrt(i))?1:0.不过这里有另一个话题,这个结构不太好,因为否定的结论在for循环中就已经得到了,在循环结束后用j>sqrt(i)的间接证实属于不当行为(是不是教材上就是这样写的呀?)
以上的说法是我作为一个软件公司的考官时,对考生的忠告:不要以教材上的代码作为自己的学习范例--应该看看编码规范了(网上能找到)如林锐的C/C++高质量程序设计,华为编程规范、中兴软件编程规范等。