免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 以其昏昏,使人昭昭? [复制链接]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
171 [报告]
发表于 2010-04-14 13:46 |只看该作者
本帖最后由 shan_ghost 于 2010-04-14 13:48 编辑

关联=be referenced by:
The variable can be referenced by identifiers

接上面:
c语言中,函数名,结构名也可以成为标识符,这个怎么解释?
water_wf 发表于 2010-04-14 12:54


这个问题正好说明了把概念弄明白的好处所在。

标识符就是个名字,你管他是函数名、结构名还是变量名呢?

写编译器,不丢掉标识符的具体含义,你有办法写出语法分析模块吗?


例如:
x=max(a,b) * c

max是宏还是函数,写语法分析时需要关心吗?进一步说,反正它执行后就会得到一个匿名的变量,而我们关心的只是这个变量——那么,又何必区分它究竟是变量还是函数呢?一视同仁为“标识符”能省多少事。

(这就是所谓:表达式是通过运算符连接起来的一组标识符/立即数;单个标识符/立即数也是表达式)


再比如,161楼的英文有这么一句话——内存地址是具体内存单元的一个标识符——好吧,如果这样理解,那么就有:
int i
i是个标识符,关联了某个变量

&i的结果是0x123456,而0x123456又是个标识符,它关联了某个内存位置

ax也是个标识符,它关联了某个寄存器

具体实现上,i关联的变量又和0x123456关联的内存位置或者ax关联的寄存器相当——所以变量本身是个抽象概念,既不等于内存单元也不等于寄存器。


所以,解析源代码时,编译器只管弄明白i代表了一个变量就够了;
实际执行时,i可以随时改变关联——比如关联到寄存器ax/bx;关联到内存地址0x123456;关联到二级缓存的某个位置……

随便它如何关联,只要通过标识符i仍然能关联到这个变量当前的正确值,这就够了。

正是这种灵活性,为编译优化/CPU指令优化留下了大量的空间。




说句题外话:
正规的科学概念就是如此严谨,可以随便你用各种方式钻牛角尖而不错乱——当然,钻牛角尖的“各种方式”也是有严谨定义的,比如什么是概念、概念的内涵和外延;什么是逻辑等待。

当你真学会的时候,就会发现科学体系是如此的严谨,一字之差就谬以千里;但同时这个体系又是如此的简洁,只要很少一些基本概念理解正确了,整个体系就可以从任何一个概念出发整个拎起来,毫无晦涩之处,毫无必须死记硬背之处。

而要达到这个境界,就必须下功夫把每一个概念彻底拎清。



垃圾书的危害,就在于这些细小概念的混淆以及思维方式、逻辑上面的混乱。正是这种种细微的混淆之处,导致大局上无法自圆其说——或者说,经不起推敲。
而经不起推敲的东西想存在下去,就必须禁止推敲——所以,学垃圾书,你就必须学会死记硬背。拿它的结论、它的具体操作方法去套,你肯定是能得到正确结果的:但为什么会得到正确结果?你不会知道,也不再有能力知道。

细节拎不清并且还禁止拎清,那么,可想而知,你将永远失去思考的能力。


所以,真正学会了的人,并不会比那些学岔了的人多知道多少东西——多高级的概念都能找到书,不是吗?
但,真正学会的人,会真正深刻理解每个词甚至每个字的含义,并且知道可以如何用这些字这些词拼出已有或者尚不存在的高级概念。

而一个学岔了的人——面对各种形状不规则、七扭八歪的砖块,他能盖起高楼吗?

论坛徽章:
0
172 [报告]
发表于 2010-04-14 13:55 |只看该作者
不太明白。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
173 [报告]
发表于 2010-04-14 14:02 |只看该作者
本帖最后由 shan_ghost 于 2010-04-14 14:12 编辑
请问如何不知道变量在哪里那么i = 3;和*j = 3如何理解成是为这个变量赋值而不是为标示符赋值呢。
water_wf 发表于 2010-04-14 12:50



    i和j本身是标识符,而这个标识符代表着一个变量。

标识符这个概念就是:一个唯一的字符串,可用于区分某个特定实体。

而在赋值语句里,i = 3 的含义是: 将标识符i对应的那个变量赋值为3;这句话可简写为:将变量i赋值为3.


就好像water_wf是一个名字,这个名字代表着一个发帖的人一样。

当我说water_wf的某个帖子时,我当然指的是具体的某个人在发帖,而不是water_wf这个字符串在发帖。
也就是说,在日常语言里,直接使用标识符已经隐含了reference这个动作——此时water_wf这个字符串已经隐含的被这个ID代表的那个人替代。



理解不了这个,就是因为没有正确理解语言、从中汲取营养的能力。

那么,正确理解语言、汲取营养的能力从何而来?

从大量好书的阅读中慢慢培养出来。



显然,一旦从一开始就接触到坏书,以至于没能学会这类基本知识(甚至是被坏书歪曲了思维)——那么,将来就是有好书摆在面前,你也无法从中汲取丝毫营养,而是只能拿他像坏书一样死记硬背。

这就是我为何说“一旦被坏书引入岔道,就永远学不会思考”。

论坛徽章:
0
174 [报告]
发表于 2010-04-14 14:28 |只看该作者
呵呵,谢谢你的回复,结论先不要下:语法分析我也正在做,有什么好的建议也请发过来,我们继续:
###
i和j本身是标识符,而这个标识符代表着一个变量。
###
这里的“代表”什么意思,和刚才你揭示的“关联”有什么关系,还是标示符就是c语言中变量名函数名的一种表示方式。仅仅是语言的一种规则呢?
###
所以,int i 就定义了一个变量,这个变量被我们命名为i——i是标志符,不是变量;但我们可以通过i这个标志符来找到变量i。

通过c++的引用机制,我们可以再定义一个标识符j,让j同样和i代表的那个变量关联:
int &j=i;
###
请问这段话中有几个变量?
另外
##
那么,正确理解语言、汲取营养的能力从何而来?

从大量好书的阅读中慢慢培养出来。
##
最初没有好书的时候那些人的能力从哪里来的呢?

论坛徽章:
0
175 [报告]
发表于 2010-04-14 14:29 |只看该作者
有个问题你还没有回答我:
标示符和变量是程序语言层的还是计算机科学层的概念?

论坛徽章:
0
176 [报告]
发表于 2010-04-14 14:32 |只看该作者
pmerofc:
   不想打断你的帖子,你请继续主贴,我会贴一些python中对应的概念来和c/c++对比。
shan_ghost:
  我深刻认为能力一部分来自于相互间的讨论!

论坛徽章:
0
177 [报告]
发表于 2010-04-14 14:41 |只看该作者
{:3_196:}变量   变量名   变量值  变量地址
说变量名“代表”一个地址就可以说得通的,因为每次用  &i   返回给你的都是一个地址。

不过在新手书里面这样解释变量名,真是有点。。。

论坛徽章:
0
178 [报告]
发表于 2010-04-14 15:19 |只看该作者
###
所以,int i 就定义了一个变量,这个变量被我们命名为i——i是标志符,不是变量;但我们可以通过i这个标志符来找到变量i。

通过c++的引用机制,我们可以再定义一个标识符j,让j同样和i代表的那个变量关联:
int &j=i;
###
请问这段话中有几个变量?
另外
##
这个问题似乎不太准确我们还是限定到c语言中
可以改成
int i;
int *j = &i;
这里面有几个变量?

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
179 [报告]
发表于 2010-04-14 15:25 |只看该作者
本帖最后由 shan_ghost 于 2010-04-14 15:35 编辑

回复 174# water_wf


    1、有几个变量请自己学会阅读。

   2、最初的好书从哪里来?从人类千万年历史长河中,那些思考“白马非马”之类牛角尖问题而又侥幸没疯的那些智者的思考中一点一滴积累而来。

   3、学而不思则罔,思而不学则殆
      当然,这句话没说全——离开了实践的检验和校正,思的越多/学的越多,疯的就越多。

思考能力就是如此的得来不易;但很不幸,想毁掉它却非常轻松。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
180 [报告]
发表于 2010-04-14 15:30 |只看该作者
本帖最后由 shan_ghost 于 2010-04-14 15:36 编辑

最后,在下没有耐心一点一滴去替别人纠正/补足功课,更不想因为一个&符号就在论坛上从变量开始导啊导啊导出一本《计算机常见基础概念误解辨析及深入剖解》来


而且,即使导出这种东西来了,对于不会思考的家伙来说,无非是多了些记忆/背诵的负担,并且只能导致他概念更加混乱,更加不可理喻。

如何学会批判的阅读,学会从细节到整体再回到细节本身的判决性思考,这不是我或者别的任何人能轻易教会的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP