首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dummies的评估顺序

Dummies的评估顺序
EN

Stack Overflow用户
提问于 2013-06-18 20:42:08
回答 1查看 84关注 0票数 0

无论我读多少主题,我都不能理解评估策略。你能举个例子给我解释一下这三种评估顺序吗?我正在写下面的代码。你能用下面的代码解释按需调用(惰性求值)、按名称调用(正常顺序求值)、按引用调用吗?你也可以用你的例子来解释它们。我只想理解他们,但我就是不能理解。

代码语言:javascript
运行
复制
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);
}

提前谢谢。

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 21:42:26

这里没有懒惰,因为所有受影响的东西都是通过值传递的,并且全局指针永远不会被解除引用,直到它有未定义的行为这样做(指向已经返回的函数的局部变量的指针)。

程序行为,其中适当表达式的值将显示在调试器的监视列表中。注意,*p是一个表达式,而不是一个变量:调试器会懒惰地计算它,但它并不是真正在内存中的东西。

对respectively.

  • test(0,()的测试调用将表达式ia[0]a[i]求值为01010 respectively.

  • test(0,10,10)开始--> {x,y,z,p,*p} = {0,10,10,(未初始化),(invalid)}

  • 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

  • Function返回。p现在是一个摇摆不定的指针!当你取消引用它时,任何事情都可能发生。

  • The big printf():第五个数字是未定义的(应用程序甚至可能在函数被调用之前崩溃),但如果星号是对的,它可能是12。在这种情况下,它将显示10 20 30 40 12

事实上,指针并不是真正用来演示指针是如何工作的:这是一种浪费的潜力。就指针而言,这是一个糟糕的示例代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17169150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档