搜索
查看: 6641|回复: 71
打印 上一主题 下一主题

求助下...为何出错!

[复制链接]
跳转到指定楼层
楼主
发表于 2014-3-30 21:06:00 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 超神级 于 2014-3-30 23:20 编辑

//以下为错误教程!下面帖子为讨论...看着玩吧
本文的目的更透彻了解数据结构!基础篇.
先来段程序运行下;
#include<stdio.h>
int main()
{
int a,b,c;
printf("a=%d\nb=%d\nc=%d",&a,&b,&c);
    printf("看到了吗!a+4=b,b+4=c的地址!\n");
system("pause");
return 0;
}
why!因为在程序编译的int a,b,c;会向系统请求一块大小为12个字节大小的内存空间所以内存空间是连续的(理论是这样的)!
(a,b,c是在编码、编译阶段的一个符号,在最终的可执行代码中是不存在的,所以不占空间)。
上面东西和数据结构有什么关系先别急嘛!请看下文分解!
我们要使用上面的东西来模拟下简单数组没有结构那些乱七八糟的东西只有一些大家都熟悉的东西.

#include<stdio.h>
int main()
{
int a,b,c;
int *p = &a;
p[0]=1;
p[1]=2;
p[2]=3;
printf("%d\n%d\n",a,b,c);
system("pause");
return 0;
}
/*
按照理论来讲应该没什么刚才我测试上面代码竟然报错也没调试出
原因!本来想写个教程的郁闷!、、后面还有半段内容等找出上面代码错误原因在继续写.
希望大神帮忙给个解答!上面代码为何错误.
*/


来自 5#
发表于 2014-3-30 22:06:30 | 只看该作者
还有我记得和你说过一次
指针有自己的占位符%p,不要用%d输出地址
推荐
发表于 2014-3-30 21:22:32 | 只看该作者
本帖最后由 rosynirvana 于 2014-3-30 21:27 编辑

printf("%d\n%d\n",a,b,c);
这里
我改了这句然后能编译

标准可没有承诺过把a,b,c依次分配内存
不知道你在哪里看到的?

下面那段代码,把printf那句修正后,我这里输出是
1
3
2

所以说gcc的实现也不是把a,b,c依次分配的
63#
发表于 2014-9-5 23:34:24 | 只看该作者
嗨,强哥! 发表于 2014-8-12 00:37
你错了。李掌柜没有反的算。今天复习刚如碰到此类题。Printf函数中参数是从右向左依次计算的,有点类似逗 ...

是不是说
  1. printf("%d %d", a+b, b+2);
复制代码

然后会先计算b+2再计算a+b?

这个是由编译器自己决定的,对于gcc确实是从右到左处理
62#
发表于 2014-9-5 23:29:16 | 只看该作者
超神级 发表于 2014-8-13 12:29
对于代码的执行顺序。我记得好像是从上到下,从右到左。(优先级一样)撇除跳转语句。。

其实C里面没有规定过

a = f(x) + g(x); 可以先计算f(x),也可以先计算g(x),编译器自己处理的
61#
发表于 2014-9-5 23:28:05 | 只看该作者
超神级 发表于 2014-8-12 12:52
话说printf内部实现100%个人有99个不会的。因为不具体。就好象printf怎么实现了和重载一样的功能。。估计 ...

printf的实现也是基础了,K&R第七章就有讲过的
只是完全实现那些个占位符是非常麻烦的
60#
 楼主| 发表于 2014-8-18 06:36:50 来自手机 | 只看该作者
嗨,强哥! 发表于 2014-8-17 15:51
不怪,因为printf()参数计算顺序是从左到右,所有反了。。。

恩恩。有时间我也试试。
来自: 微社区
59#
发表于 2014-8-17 15:51:10 | 只看该作者
本帖最后由 嗨,强哥! 于 2014-8-19 10:21 编辑
李掌柜 发表于 2014-3-30 22:01
你的第一个例子的地址,我电脑上是这样的:
和你说的空间大小不一样,,,

不怪,因为printf()参数计算顺序是从左到右,所有反了。。。-----------纠正错误:printf()参数计算顺序是从右到左,汗,没注意审查。。。。。
58#
发表于 2014-8-17 15:46:49 | 只看该作者

[mw_shl_code=c,true]#include <stdio.h>
int main()
{
        int a, b, c;
    printf("%d\n%d\n%d\n",  &c, &b,&a);

        sleep(5000);
        return 0;
}[/mw_shl_code]

这样看,a b c就是连续地址,相当于数组。。。。
57#
发表于 2014-8-17 15:43:43 | 只看该作者

关于printf()参数计算顺序,举个栗子:
int a = 1;
printf("%d\n%d\n",  a, a++);
输出结果:
2
1
我重新编辑了回复
刚刚上机验证,这段程序是正确的。
56#
 楼主| 发表于 2014-8-16 18:48:39 | 只看该作者
嗨,强哥! 发表于 2014-8-15 23:39
手机看帖显示有问题,第一参数是a,第二个是a十十,这十十没有正常显示啊?!

饿                    
55#
发表于 2014-8-15 23:39:24 来自手机 | 只看该作者
手机看帖显示有问题,第一参数是a,第二个是a十十,这十十没有正常显示啊?!
来自: 微社区
54#
发表于 2014-8-15 23:36:28 来自手机 | 只看该作者
本帖最后由 嗨,强哥! 于 2014-8-17 15:40 编辑

关于printf()参数计算顺序,举个栗子:
int a = 1;
printf("%d\n%d\n",  a, a++);
输出结果:
2
1
来自: 微社区
53#
发表于 2014-8-15 23:33:02 来自手机 | 只看该作者
超神级 发表于 2014-8-12 12:59
我自己也有点晕菜了。等ROS大大吧!。。。

关于printf()参数计算顺序,举个栗子:
int a = 1;
printf("%d\n%d\n", a,a  );
输出结果:
2
1
来自: 微社区
52#
发表于 2014-8-15 23:26:19 来自手机 | 只看该作者
超神级 发表于 2014-8-13 12:37
感谢强哥的解答!然后就是前面的话看错。。。回复有点乱七八糟

你的程序我验证了一遍,三个变量地址是连续的(程序执行结果表明现实),至于为什么是从大到小排,其实是printf()函数对参数从右向左计算的结果。你想让它们的地址从小到大排列,只要printf("…",c,b,a)这样写就行了。
来自: 微社区
51#
 楼主| 发表于 2014-8-13 12:37:47 来自手机 | 只看该作者
嗨,强哥! 发表于 2014-8-12 10:48
printf()函数括号里的参数是从右向左开始计算的,所以第二个例子,b=3.你要是显示b=2,可以把第3个参数去 ...

感谢强哥的解答!然后就是前面的话看错。。。回复有点乱七八糟
来自: 微社区
50#
 楼主| 发表于 2014-8-13 12:31:30 来自手机 | 只看该作者
一切看起来都很正常。。。
来自: 微社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表