2016-08-03 59 views
-1

我知道答案是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; 
} 
+1

看起来像简单的数学。你有什么特别的不确定性? – dbush

+0

这里有什么问题?这只是一些简单的数学运算... – naccyde

+0

我必须错过这一点。当我手动追踪时,我得到a = 19,b = 23,c = 18。 –

回答

2

让我们通过线做这行 -

一个= 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

0

该代码充满了重新分配和多余的初始化,这使得代码不必要地难以遵循。如果我们像这样重写计算将更容易理解:

#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; 
}