搜索
查看: 2572|回复: 16
打印 上一主题 下一主题

(scanf与printf)以前有个朋友问过我这个问题!我是这样回答

[复制链接]
跳转到指定楼层
楼主
发表于 2013-10-11 15:34:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 超神级 于 2013-10-11 15:37 编辑

我当时也是初学者!我是对他大概是这样说的:
打个比方你去商店买东西你知道你要买什么(printf)!但是你要知道这个东西多少钱,你需要问老板并且从老板得到记住价钱(scanf)!才能把钱给老板(printf)!
今天群里有位童鞋问我还是这个问题scan为什么要用&:
我哑然:
我本来想说这个是规定的格式scanf("格式化字符串",这个是地址你不用取址符也可以);想了一下感觉不太合适!
(发这个帖子的目的是想说有些细节很重要,要不连最简单的东西搞不清你会感觉学了那么久编程真的很失败)
                       下面是引用csdn论坛一位大牛的话感觉有可取之处(但不全部认同)
提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……




沙发
发表于 2013-10-11 15:53:11 | 只看该作者
csdn那位我也见过,他的话能代表一部分程序员的态度,可惜前两条是完全错误的……
板凳
发表于 2013-10-11 16:01:47 | 只看该作者
其实scanf为什么要传指针进去很容易解释,我也举个例子
例如要写一个函数,交换两个int变量的值
可以这么写吗?
  1. void swap(int a, int b)
  2. {
  3.     int t = a;
  4.     a = b;
  5.     b = t;
  6. }
复制代码
明显不可以,这是个经典例子,凡是学过C function的都会碰到
scanf的问题是一样的,要通过一个函数来修改一个变量的值,那么必须把这个变量的指针传给函数
地板
 楼主| 发表于 2013-10-11 17:22:39 | 只看该作者
rosynirvana 发表于 2013-10-11 15:53
csdn那位我也见过,他的话能代表一部分程序员的态度,可惜前两条是完全错误的……

额...........
5#
 楼主| 发表于 2013-10-11 17:30:10 | 只看该作者
rosynirvana 发表于 2013-10-11 16:01
其实scanf为什么要传指针进去很容易解释,我也举个例子
例如要写一个函数,交换两个int变量的值
可以这么 ...

嗯            
6#
 楼主| 发表于 2013-10-11 17:33:21 | 只看该作者
感觉现在对有些东西理解的不是很透彻!
7#
发表于 2013-10-11 18:25:15 | 只看该作者
超神级 发表于 2013-10-11 17:22
额...........

首先,编译器是会犯错的。
C语言是由ISO C标准来定义的,不是由哪家编译器定义的。
所以C存在一种绝对权威,就是ISO C的文本,只要讨论的对象是通行的C语言(而不是哪家的C“方言”),你可以很自信的说,凡是符合ISO C标准的才是正确的,无论哪家的编译器给出了什么结果,只要和ISO C标准相悖,那就是编译器错了。

然后,不应该用汇编解释C语言。
ISO C语言是一种定义在抽象计算机(abstract machine)上的语言,编译器做的事情其实就是把这种抽象计算机的行为投射到某种特殊的计算机上去。所以说,指针变量里装的是内存地址,对吗?只在当前常用的计算机架构下是正确的,对于某些不常见的计算机,或者将来的计算机来说,则是未必正确的。
另外,用汇编来解释C也不大实用,如果你手边不放一份ISO C的文本……ISO C含有大量的未定义行为,例如你这么写
int i = 0;
i = i++;
主流编译器都会告诉你一个结果,但是这并不代表这一段是“正确”的C程序——编译器没有义务告诉你这段代码中包含未定义行为。
所以,依靠汇编代码来解释C,很多时候会把错误的当成正确的,并且还自以为“从深层次彻底掌握了”某个知识点,却不知只是编译器因为这样做方便随便告诉你个结果而已——这是程序员的责任,不是编译器的。
8#
发表于 2013-10-11 18:29:44 | 只看该作者
超神级 发表于 2013-10-11 17:33
感觉现在对有些东西理解的不是很透彻!

因为你选择了学C
C真的不是适合初学者的东西

还有我估计你没研究过K&R CS:APP这两本书,这两本书读通了,才可以谈“理解”
9#
 楼主| 发表于 2013-10-11 19:17:37 | 只看该作者
rosynirvana 发表于 2013-10-11 18:29
因为你选择了学C
C真的不是适合初学者的东西

K&R 看过前面几章!CS:APP这本书没听过.....
10#
 楼主| 发表于 2013-10-11 19:21:37 | 只看该作者
rosynirvana 发表于 2013-10-11 18:29
因为你选择了学C
C真的不是适合初学者的东西

大神!为什么我下的汇编编译器都用不了!
求大神给我推荐个可以用的!
英文中文都可以!
11#
发表于 2013-10-11 19:31:47 | 只看该作者
超神级 发表于 2013-10-11 19:21
大神!为什么我下的汇编编译器都用不了!
求大神给我推荐个可以用的!
英文中文都可以!

nasm
不过要注意,汇编不是一种统一的语言,是由汇编器自己定义的,语法要看nasm的手册
12#
发表于 2013-10-11 19:32:43 | 只看该作者
超神级 发表于 2013-10-11 19:17
K&R 看过前面几章!CS:APP这本书没听过.....

K&R至少要读两遍以上
CS:APP中文引进版的书名叫《深入了解计算机系统》
13#
 楼主| 发表于 2013-10-11 19:53:19 | 只看该作者
rosynirvana 发表于 2013-10-11 19:31
nasm
不过要注意,汇编不是一种统一的语言,是由汇编器自己定义的,语法要看nasm的手册

啊!!!!嗯!!!!
14#
 楼主| 发表于 2013-10-11 19:53:37 | 只看该作者
rosynirvana 发表于 2013-10-11 19:32
K&R至少要读两遍以上
CS:APP中文引进版的书名叫《深入了解计算机系统》

嗯!!!!!
15#
 楼主| 发表于 2013-10-11 20:07:53 | 只看该作者
超神级 发表于 2013-10-11 19:53
啊!!!!嗯!!!!

我下载了、!可以用!感谢!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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