无论我读多少主题,我都不能理解评估策略。你能举个例子给我解释一下这三种评估顺序吗?我正在写下面的代码。你能用下面的代码解释按需调用(惰性求值)、按名称调用(正常顺序求值)、按引用调用吗?你也可以用你的例子来解释它们。我只想理解他们,但我就是不能理解。
int a[4] = {10,20,30,40};
int i = 0;
int *p;
void test(int x, int y, int z)
{
p = (int *)malloc(sizeof(int));
*p=x;
x++; y++; z++;
p = &z;
printf("%d %d %d\n",x,y,z);
x++; y++; z++;
p = &z;
printf("%d %d %d\n",x,y,z);
}
main()
{
test(i,a[0],a[i]);
printf("%d %d %d %d %d\n", a[0],a[1],a[2],a[3],*p);
}提前谢谢。
}
发布于 2013-06-18 21:42:26
这里没有懒惰,因为所有受影响的东西都是通过值传递的,并且全局指针永远不会被解除引用,直到它有未定义的行为这样做(指向已经返回的函数的局部变量的指针)。
程序行为,其中适当表达式的值将显示在调试器的监视列表中。注意,*p是一个表达式,而不是一个变量:调试器会懒惰地计算它,但它并不是真正在内存中的东西。
对respectively.
i,a[0]和a[i]求值为0,10和10 respectively.
p = (int *)malloc(sizeof(int)); --> {x,y,z,p,*p} = {0,10,10,(在堆上的某处),(uninitialized)}
*p=x; --> {x,y,z,p,*p} = {0,10,10,(堆上某处),0}
x++; y++; z++; --> {x,y,z,p,*p} = {1,11,11,(堆上某处),0}
p = &z; --> {x,y,z,p,*p} = {1,11,11,&z,11} (内存泄漏,错误锁定内存的地址在没有被freed)
printf("%d %d %d\n",x,y,z);的情况下被“忘记”显示1 11 11
x++; y++; z++; --> {x,y,z,p,*p} = {2,12,12,&z,12}
p = &z;没有变化,p已经指向z.
printf("%d %d %d\n",x,y,z);显示2 12 12
p现在是一个摇摆不定的指针!当你取消引用它时,任何事情都可能发生。
10 20 30 40 12事实上,指针并不是真正用来演示指针是如何工作的:这是一种浪费的潜力。就指针而言,这是一个糟糕的示例代码。
https://stackoverflow.com/questions/17169150
复制相似问题