复杂的C函数测试知识静态、全局、局部变量和指针

复杂的C函数测试知识静态、全局、局部变量和指针,c,pointers,C,Pointers,免责声明:是的,这是一个家庭作业问题。我很难理解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 =

免责声明:是的,这是一个家庭作业问题。我很难理解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和j,原因是swap什么都不做,因为变量a和b在堆中被删除了

对于第二个集合,我们在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(i)返回7。那么这就是我遇到困难的部分。然后我们将j的内存位置作为参数传递,但是我们传递哪个j,为什么?从输出来看,似乎静态j的内存正在被传递,但我不确定

当我们进入函数f2时,我们得到*p+=x,我认为它给出了值14,因为x从前面设置为7,j也是7。我没有得到的是第二行:“*p=(*p>20)?20:*p++;”。这到底是什么意思?从输出来看,它似乎已经将j的值复制到i中


函数f2中的第二行代码是做什么的?在“f2(f1(i),&j);printf(“i=%d j=%d\n”,i,j);”行中调用了哪个j(前面带&号的粗体代码)。

f2
的说明执行以下操作:

*p+=x;
这会将
x
的值添加到存储在
p
所指位置的任何内容中。
*
取消引用指针
p

*p = (*p>20) ? 20 :*p++;

如果在
p
处存储的值大于20,则在
p
处存储20。否则,将
p
的值存储在
p
处并递增
p
,这是未定义的行为(由酷家伙指出),因为
*p++
相当于
*p=*p;p++

您应该使用调试器逐行检查代码,并检查每一行的功能(以及变量的值)-在您进入
f2
之前,您对发生的情况的分析是错误的,您的打印说明
i=13j=14
,那么您为什么认为
*p+=x收益率14?我还没有得到那部分。共有5次打印i和j。第三行“j=f1(i/2);printf(“i=%d j=%d\n”,i,j);”被调用两次,一次在大括号中,一次不在大括号中。我仍然在第一个调用中,它与第三个对相关,它实际上给出了14个输出。您指的是第4对,我还没有找到。您的程序中没有堆分配,因为它不使用malloc/free。谢谢,这是非常有用的。在我在问题中添加评论之前,你知道我在电话里叫哪个j吗?或者用一种稍微简单一点的方式重新表述一下,你能回答我刚才添加在上面问题中的//注释吗?
f2(f1(I),&j)使用内部
j
。外部
j
不再可见,更接近另一个
j
的声明。在
f1
中,使用本地静态
j
。gobal
j
也不再可见,并声明了一个更近的
j
。这个概念被称为“范围”。“否则,只需增加存储在
p
”中的值-这样做不是很简单吗
*p=*p++”
*p = (*p>20) ? 20 :*p++;