下面的代码完美地计算了一个数字的阶乘。
#include <stdio.h>
long int f_fact(int i);
int main() {
int a;
long int factorial;
printf("Please enter a number\n");
scanf("%d", &a);
factorial = f_fact(a);
printf("The factorial is %ld\n", factorial);
return 0;
}
long int f_fact(int i) {
int j;
long int factorial = 1;
for (j = 2; j <= i; ++j) {
factorial = factorial * j;
}
return (factorial);
}
但是,这个其他代码没有。唯一的区别是使用 thisfor (j = 2; j <= i; ++i)
而不是 this for (j = 2; j <= i; ++j)
。
#include <stdio.h>
long int f_fact(int i);
int main() {
int a;
long int factorial;
printf("Please enter a number\n");
scanf("%d", &a);
factorial = f_fact(a);
printf("The factorial is %ld\n", factorial);
return 0;
}
long int f_fact(int i) {
int j;
long int factorial = 1;
for (j = 2; j <= i; ++i) {
factorial = factorial * j;
}
return (factorial);
}
我的问题是如何才能最好地发现代码中的这些小错误?现在,我已经-Wall
和-Wextra
激活,但即使有这些我越来越:Errors: 0
和Warnings: 0
这使得它有点难以发现的问题。有什么建议可以更好地解决错误吗?谢谢!
您已经知道并使用-Wall -Wextra
,它可以-Werror
通过标记许多经典问题来完成以检测潜在错误。
虽然您可以添加更多编译器选项来尝试检测其他问题,但很难检测到逻辑错误。例如,如果设置了变量但未使用,则可以检测到简单的拼写错误,但您的错误仍然不会被注意到。
其他预防措施包括编码风格和命名约定:非常严格的风格规则,尤其是空格和缩进的一致使用,有助于使代码更具可读性,并为隐藏愚蠢的错误提供更少的空间。命名约定也有帮助:在您的示例中,不应将参数命名为i
,而应命名为n
. i
是索引变量的默认名称,正如您自己所经历的那样,因此正确命名参数将有效地防止此错误:
long int f_fact(int n) {
long int factorial = 1;
for (int i = 2; i <= n; i++) {
factorial *= i;
}
return factorial;
}
除了-Wall -Wextra
(和-Weverything
用于 clang)之外,这里还有一些我用于我的项目的额外标志:
char
类型的问题:-funsigned_char -Wchar-subscripts
printf
使用可变格式字符串防止:-Wformat-nonliteral
const
:-Wwrite-strings
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句