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

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

[复制链接]
楼主
发表于 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 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,很多时候会把错误的当成正确的,并且还自以为“从深层次彻底掌握了”某个知识点,却不知只是编译器因为这样做方便随便告诉你个结果而已——这是程序员的责任,不是编译器的。
地板
发表于 2013-10-11 18:29:44 | 显示全部楼层
超神级 发表于 2013-10-11 17:33
感觉现在对有些东西理解的不是很透彻!

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

还有我估计你没研究过K&R CS:APP这两本书,这两本书读通了,才可以谈“理解”
5#
发表于 2013-10-11 19:31:47 | 显示全部楼层
超神级 发表于 2013-10-11 19:21
大神!为什么我下的汇编编译器都用不了!
求大神给我推荐个可以用的!
英文中文都可以!

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

K&R至少要读两遍以上
CS:APP中文引进版的书名叫《深入了解计算机系统》
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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