发表这篇文章的原因是因为我很难理解《在 Mac 上学习 C,第二版》中的“第七章练习”中的几个问题。
a部分:
// the following code is part a, of question 1
void add_one(int *my_var);
int main(int argc, const char * argv[]) {
int num, i;
num = 5;
for (i = 0; i < 20; i++) {
add_one(&num);
// printf("Num equals: %d\n", num);
}
printf("Final value is %d.\n", num);
return 0;
}
void add_one(int *my_var)
{
(*my_var) ++;
}
b 部分:
// the following code is part b, of question 1
int g_number;
int multiply_it(int my_var);
int main(int argc, const char * argv[]) {
int i, g_number = 2;
for (i = 1; i <= 2; i++) {
g_number *= multiply_it(g_number);
// printf("Global number equals: %d\n", g_number);
}
printf("Final value is %d.\n", g_number);
return 0;
}
int multiply_it(int my_var) {
return (my_var * g_number);
}
c 部分:
// the following code is part c, of question 1
int g_number;
int double_it(int my_var);
int main(int argc, const char * argv[]) {
int i;
g_number = 1;
for (i = 1; i <= 10; i++) {
g_number *= double_it(g_number);
}
printf("Final value is %d.\n", g_number);
return 0;
}
int double_it(int my_var) {
return 2 * my_var;
}
在书的后面,他们给出了b部分的最终值,为“512”;对于 c 部分,为“1024”。
我理解他们如何得出 a 部分的答案,但我很难理解他们对 b 和 c 部分得到的答案。
这三个不同的部分在教科书中以代码片段的形式呈现,但问题的一部分是每个部分都有自己的 main()。我不确定为什么以这种方式呈现,但我尝试注释掉其他 main() 声明行(其中的代码除外)。
当我尝试组合 a 和 b 部分时,a 部分将输出正确答案(25),但 b 部分将输出值“0”。所以,我什至还没有尝试c部分。因为 c 部分是 b 部分的两倍,所以我假设如果我能算出 b 部分,我就能算出 c 部分。
有没有人可以帮助我理解这一点,或者指出我可以理解答案的方向?
提前感谢您的帮助!
首先,全局整型变量在声明时被初始化为 0。 因此,代码中的 b 部分,
int g_number;
将设置为 0。
其次,函数
g_number
中的multiply_it()
指的是全局变量,其值为0。因此,它会返回0,因为myvar * 0
始终为0。
int multiply_it(int my_var) {
return (my_var * g_number);
}
我的猜测是你的局部变量
g_number
不应该被声明。相反,全局变量应该分配给 2。
这个应该是
int i, g_number = 2;
像这样
int i;
g_number = 2;
它按预期打印 512。