免责声明:是的,这是一个家庭作业问题。我很难理解函数f2的作用。
#include <stdio.h>
int i = 10; /* global variable */
int j = 1; /* global variable */
/* Forward function declarations */
void swap(int, int); int f1(int);
void f2(int, int *);
int main()
{
{
int i = 1;
int j = 10;
swap(i,j); printf("i = %d j = %d\n", i,j);
j = f1(i++); printf("i = %d j = %d\n", i,j);
f2(f1(i),&j); printf("i = %d j = %d\n", i,j);
//which j does this refer to? The static variable, global, or local and why
}
j = f1(i/2); printf("i = %d j = %d\n", i,j);
f2(f1(i),&j); printf("i = %d j = %d\n", i,j);
return 0;
}
void swap(int a, int b)
{
int temp;
temp=b; b=a; a=temp;
}
int f1(int x)
{
static int j = 5;
i++;
j+=x;
return j;
}
void f2(int x, int *p)
{
*p+=x;
*p = (*p>20) ? 20 :*p++;
}
当我将此代码运行到编译器中时,我得到以下答案:
i = 1 j = 10
i = 2 j = 6
i = 14 j = 14
i = 13 j = 14
i = 14 j = 20
我理解第一组i和j,因为变量a和b在堆中被删除,因此swap没有做任何事情。
对于第二组,我们在main中递增i,然后我们将值1用作x,因为i ++是后递增的。我们创建一个静态变量j,全局变量x增加到11,并且它将j返回为6,因为x被添加到j。函数完成后,main中的i变量增加到2.这导致2和6。
对于第三个print语句,我首先调用等于2的f1(i),这将j重置为5并将全局变量i递增为12.然后j设置为7并且我们为f1返回7(i )。那么这就是我遇到困难的部分。然后我们将j的内存位置作为参数传递,但是我们传递哪个j,为什么?从输出看起来好像静态j的内存正在通过,但我不确定。
当我们进入函数f2时,我们得到* p + = x,我认为它给出值14,因为x从之前设置为7而j也是7.我没有得到的是第二行:“ * p =(* p> 20)?20:* p ++;“。这甚至意味着什么?从输出中它似乎已将j的值复制到i。
函数f2中的第二行代码是什么以及哪一个j(在其前面带有&amp;符号的粗体代码)在“f2(f1(i),&amp; ”行中调用j ); printf(“i =%dj =%d \ n”,i,j);“。
答案 0 :(得分:1)
f2
的说明执行以下操作:
*p+=x;
这会将x
的值添加到p
指向的位置存储的内容中。 *
取消引用指针p
。
*p = (*p>20) ? 20 :*p++;
如果p
中存储的值大于20,则将{20}存储在p
。否则将p
的值存储在p
并增加p
,这是未定义的行为(Cool Guy指出),因为*p++
等同于*p = *p; p++;