C 改进此代码可读性的建议
我不确定我是否应该在这里问这个问题,或者问其他StackExchange网站,但我会继续。。。如果此处不适合,请迁移) 我正在检查一个代码。要求调用函数C 改进此代码可读性的建议,c,code-readability,C,Code Readability,我不确定我是否应该在这里问这个问题,或者问其他StackExchange网站,但我会继续。。。如果此处不适合,请迁移) 我正在检查一个代码。要求调用函数n的次数,参数范围为0到n。但是如果n大于7,则只调用该函数7次 我的同事按如下方式实施: void ExecuteFunctions(U8 count) { if(count > 0) oprA(0); if(count > 1) oprA(1); if(count > 2) oprA(2);
n
的次数,参数范围为0到n
。但是如果n
大于7,则只调用该函数7次
我的同事按如下方式实施:
void ExecuteFunctions(U8 count)
{
if(count > 0) oprA(0);
if(count > 1) oprA(1);
if(count > 2) oprA(2);
if(count > 3) oprA(3);
if(count > 4) oprA(4);
if(count > 5) oprA(5);
if(count > 6) oprA(6);
if(count > 7) oprA(7);
}
我将其修改为:
void ExecuteFunctions(U8 count)
{
for(U8 loopcnt = 0; loopcnt < count; loopcnt++)
{
oprA(loopcnt);
if(loopcnt == 7)
{
// We don't want to execute this function more number of times if it is already executed 7 times
break;
}
}
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt
但我仍然觉得有更好的方法,需要你们的投入。
(如果不在这里,也请迁移)MIN是一个有用且经常定义的宏
#define MIN(a,b) (((a) > (b)) ? (b) : (a))
#define MAX_STEP 7
void ExecuteFunctions(U8 count)
{
int loopcnt = 0;
count = MIN(count, MAX_STEP);
while(loopcnt++ < count) {
oprA(loopcnt);
}
}
定义最小值(a,b)((a)>(b))?(b):(a))
#定义步骤7中的最大值
无效执行函数(U8计数)
{
int loopcnt=0;
计数=最小值(计数,最大步数);
while(loopcnt++#define MIN(a,b) (((a) > (b)) ? (b) : (a))
#define MAX_STEP 7
void ExecuteFunctions(U8 count)
{
int loopcnt = 0;
count = MIN(count, MAX_STEP);
while(loopcnt++ < count) {
oprA(loopcnt);
}
}
定义最小值(a,b)((a)>(b))?(b):(a))
#定义步骤7中的最大值
无效执行函数(U8计数)
{
int loopcnt=0;
计数=最小值(计数,最大步数);
while(loopcnt++void ExecuteFunctions(U8 count)
{
for(U8 loopcnt = 0; loopcnt < count && loopcnt < 8; loopcnt++)
{
oprA(loopcnt);
}
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt
当然,您需要运行分析器来实际评估程序的性能。让编译器对其进行优化。我觉得以下内容更具可读性:
void ExecuteFunctions(U8 count)
{
for(U8 loopcnt = 0; loopcnt < count && loopcnt < 8; loopcnt++)
{
oprA(loopcnt);
}
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt
当然,您需要运行一个分析器来实际评估程序的性能。我会将其写成
void ExecuteFunctions(unsigned count) {
// Could use min() too if available.
unsigned iters = count < 7 ? count : 7;
for (unsigned i = 0; i < iters; ++i)
oprA(i);
}
我会把它写成
void ExecuteFunctions(unsigned count) {
// Could use min() too if available.
unsigned iters = count < 7 ? count : 7;
for (unsigned i = 0; i < iters; ++i)
oprA(i);
}
void ExecuteFunctions(U8计数)
{
对于(U8 loopcnt=0;loopcnt<(计数&7);loopcnt++)
{
oprA(loopcnt);
}
}
无效执行函数(U8计数)
{
对于(U8 loopcnt=0;loopcnt<(计数&7);loopcnt++)
{
oprA(loopcnt);
}
}
如果您真的喜欢switch
语句,请尝试此操作,看看它是否能通过代码检查:
void ExecuteFunctions(U8 count) {
int i = 0;
switch (count) {
default: oprA(i++);
case 6: oprA(i++);
case 5: oprA(i++);
case 4: oprA(i++);
case 3: oprA(i++);
case 2: oprA(i++);
case 1: oprA(i++);
case 0: oprA(i);
}
}
如果您真的喜欢switch
语句,请尝试此操作,看看它是否能通过代码审查:
void ExecuteFunctions(U8 count) {
int i = 0;
switch (count) {
default: oprA(i++);
case 6: oprA(i++);
case 5: oprA(i++);
case 4: oprA(i++);
case 3: oprA(i++);
case 2: oprA(i++);
case 1: oprA(i++);
case 0: oprA(i);
}
}
让编译器优化它。它可能会为您展开循环。@AustinMullins这主意不错,但优化功能已关闭。你可以说,它现在对我来说就像一个编程之谜!可读性或性能优化?您可以将
loopcnt<8
条件移动到循环条件。它不会优化它,但会使它更紧凑。问题不清楚:0
到7
已经是8次了。n
是否包含在范围内?您和同事的代码似乎都没有实现规范。让编译器对其进行优化。它可能会为您展开循环。@AustinMullins这主意不错,但优化功能已关闭。你可以说,它现在对我来说就像一个编程之谜!可读性或性能优化?您可以将loopcnt<8
条件移动到循环条件。它不会优化它,但会使它更紧凑。问题不清楚:0
到7
已经是8次了。n
是否包含在范围内?您的代码和同事的代码似乎都没有实现规范。您还应该提到宏存在的缺陷。在这里也很有用。while(loopcnt++
应更改为for(loopcnt=0;loopcnt
否则oprA()
将以递增的值调用。您还应提及宏的陷阱MIN
。在这里也很有用。while(loopcnt++
应更改为for(loopcnt=0;loopcnt
否则oprA()
将以递增的值调用。这将为count==8调用它零次。可能是一些类似的技巧…这将为count==8
调用零次。可能是一些类似的技巧…很好的循环。注意:swtich()
以相反的顺序调用oprA()
。对,这就是为什么我说“如果顺序不重要”。为什么你这么做了-另一个快速阅读和代码比文档更响亮的例子。此代码为计数<8
额外调用oprA()
,但如果顺序和准确性都不重要的话……我想知道为什么没有人更早地发现这一点。我将切掉switch语句部分。对于循环,这是一个很好的。注意:swtich()
以相反的顺序调用oprA()
。对,这就是为什么我说“如果顺序不重要”。为什么你这么做了-另一个快速阅读和代码比文档更响亮的例子。此代码为计数<8
额外调用oprA()
,但如果顺序和准确性都不重要的话……我想知道为什么没有人更早地发现这一点。我将删掉switch语句部分。这里没有偷东西的事。最好的答案最终会出现。不用在你的信里提到我,没有偷东西的事。最好的答案最终会出现。不用在你的信里提到我。