函数追踪代码
问题描述:
我知道答案是a = 0,b = 10和c = 2,因为我写出来并编译它,但我不确定答案是如何找到的。函数追踪代码
#include <stdio.h>
int f(int a, int b)
{
int c;
c=3*a-b;
a=(c+17)%23;
b=23%(a+5);
return a-b+c;
}
int main()
{
int a=7, b=3, c=2;
a=f(c,b);
b=f(a,c);
printf("a=%d,b=%d,c=%d\n", a,b,c);
return 0;
}
答
让我们通过线做这行 -
一个= F(C,B) -
c = 3 * a - b --> (3 * 2) - 3 = 3
a = (c+17) % 23 --> 20 % 23 = 20
b = 23 % (a+5) --> 23 % 25 = 23
return a - b + c --> 20 - 23 + 3 = 0
α= 0
B = F(A,C) -
c = 3 * a - b --> (3 * 0) - 2 = -2
a = (c+17) % 23 --> (-2 + 17) % 23 = 15
b = 23 % (a+5) --> 23 % 20 = 3
return a - b + c --> 15 - 3 + -2 = 10
b = 10
而c值仍为2
答
该代码充满了重新分配和多余的初始化,这使得代码不必要地难以遵循。如果我们像这样重写计算将更容易理解:
#include <stdio.h>
int f(int a, int b)
{
const int c = 3 * a - b;
const int d = (c + 17) % 23;
const int e = 23 % (d + 5);
return c + d - e;
}
int main(void)
{
const int c = 2;
const int a = f(c, 3);
const int b = f(a, c);
printf("a=%d,b=%d,c=%d\n", a, b, c);
return 0;
}
看起来像简单的数学。你有什么特别的不确定性? – dbush
这里有什么问题?这只是一些简单的数学运算... – naccyde
我必须错过这一点。当我手动追踪时,我得到a = 19,b = 23,c = 18。 –