【发布时间】:2020-08-19 09:31:17
【问题描述】:
下面的代码完美地计算了一个数字的阶乘。
#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);
}
但是,其他代码没有。唯一的区别是这个for (j = 2; j <= i; ++i) 而不是这个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,这使得发现问题有点困难。有什么建议可以更好地解决错误吗?谢谢!
【问题讨论】:
-
我认为这不可能。这是代码逻辑中的错误,我很确定编译器还不够聪明,无法将逻辑错误与逻辑合理的代码区分开来。我的意思是,如果您出于某种原因确实 打算在那里增加
i怎么办?编译器是否应该以某种方式猜测您正在编写阶乘函数? -
我明白你的意思@ForceBru 感谢您的快速回复! :-)
-
clang -Weverything... 使用几种不同的编译器会增加警告 -
使用 clang 的 UndefinedBehaviorSanitizer 您可以发现更多问题,但在您的情况下,它最多可以在测试时给您一个提示:godbolt.org/z/nHfIoN。
标签: c compiler-warnings