关于 chinaunix @supermegaboy 的一些意见和补充

中山野鬼 发布于 2012/10/24 17:28
阅读 316
收藏 4

首先非常感谢给予意见,整理摘抄如下,我并展开讨论:

1、ISO/IEC 9899:201X Programming languages -C。
这是2011版的C国际标准。不要怀疑作为初学者,此为第一本资料。老师告诉你,看教科书,不妨我说一句,教科书算老几啊?你没有国际标准,你如何对规范 有最权威的理解。学会使用国际标准是你要掌握的基本能力。教科书只能让你应付考试,而国际标准可以令你找到教科书的错误。
----------------------------------------------------------------------------------------------------------------------
强调标准的权威及作用,这是令人赞赏的。但不适宜作为新手的初次学习的资料。

(标准的权威性并不是唯标准论,不过多个编译器和平台使用开发后,程序员会理解标准的价值,上来就希望初学者有标准的概念,和习惯到标准上找最终说法,我认为是有必要的,当然实际开发中,标准并不是快速有效的参考资料)



1、main  有两种写法。其实别图省事,保持良好习惯,坚持使用 int argc ,char *argv[],而不是void。这是你整个程序在启动前,与外部信息对接的接口,留着总有用,何必void掉。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
这个不同意,当一个程序实际上不使用参数的时候,写上argc、argv这些东西可能会对阅读者造成误解。
(我仍然坚持argc ,argv的参数方式,入口参数的详细解释没办法铺开,但C语言,侧重模块式编写,即便是一个程序,其和被调用者之间,总要有对接,保持main 是参数的习惯,对模块设计思想是有利的)


请相信我的鬼话:标准库是唯一你能依赖,跨越任何平台均不怕的库。.......................因此标准库是要严格保证的。你想尽可能的另你的代码在跨越平台时,不需要二次修改,那么尽可能的使用标准库里的函数。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在新手的早期教育中就强调标准,是非常有益的,但如果加上对标准库中实现相关的行为的“提醒”就更好了。


这里的大概意思是说,stdout, stdin是一个标准的输入输出流,而C标准说他得是一个宏,所以我们就自己定义自己,另他成为一个宏。省得说我不支持标准。哈,现在看到标准的强大了吧。无论你是否嘲笑,你也得跟着标准来。
------------------------------------------------------------------------------------------------------------------------------------------------------------
非常怀疑作者有没有翻过C标准?无论C90、C99都说stdout、stdin是具有FILE*类型的表达式,而非宏

(我现在手头的不能立刻翻阅标准,但标准中,我影响是对stdout stdin描述为一个宏,我今晚会再查资料已确认,我的资料是C99:201X版本)


小的有char 类型,只有8个位宽。大的有long long 有 64个位宽..........................char表示8位的位宽。
---------------------------------------------------------------------------------------------------------------
char至少8位,但并非只有8位,long long也是至少64位,而非只有64位。
(这里只是常用情况的举例,而不是说一定。当然你说的是对的。哈。)

很多书籍包括标准,说这是个变量,你当然可以认为这就是个变量
--------------------------------------------------------------------------------------------
实际上,C标准并没有提出“变量”这个概念,虽然计算机程序设计语言理论主要讲述的是变量概念,但是C并不看重variable,而是object(也正因此,C的类型系统主要脉络是
从对象模型的角度来区分的),虽然C标准有些地方提到了variable这个词,但并不对什么是variable进行定义,因为它认为不需要。再次怀疑作者有没有阅读过或者理解好标准中的内容?
(标准没有直接定义出变量的这个词,但有这个意思,并非标准本身,而是引诉标准的文献转译,当然此处我的断语行为确实不妥,后续会进行改正,我尽量回避object这个词是因为如果一提对象,会另很多初学者想到了面向对象的对象

那么对应p这个用于存放地址的存储区域又是多少呢?32位的系统,是32位宽,64位的系统是64位宽。也就是说,无论你的一个指针,指向的存储区是8位宽的还是32位宽的,
哪怕是128位宽的(结构体类型的存储区域有这种情况,以后展开讨论),指针本身的存储区域的位宽只和系统有关。
-------------------------------------------------------------------------------------------------------------------------------------------------
这句话错误比较多,对指针的理解还需要较大的提升。指针的二进制宽度是实现相关的,C/C++标准仅保证void*具有最大的数值范围。换言之,
32位系统的指针不一定是32位,64位系统的指针当然也不一定是64位,更彻底地说,指针的二进制宽度是系统无关性的,它仅与编译器相关。
(这里我有比较多的异议。赞同的地方是,指针的实际宽度是和编译器相关的。至于32位的系统,指针不一定是32位确实有这种可能,但指针的宽度和逻辑寻址的宽度只一致的,因此我有个和你相矛盾的观点,指针的宽度是和系统有关的,而编译器是根据目标系统来确定指针的

变量就是存储区
---------------------
这个定义错误,变量是有名对象,变量一定是有名的,但一段存储不一定是有名的。
(这里我谈论的是变量的本质,变量是有名的,这个是事实,但不是我要强调的内容,正常变量的定义,空间的申请,都具备名称,但我希望不要让新手认为这就是数学上的一个符号,而是一个实际的存储区域,当然存在空间和时间上的限制)

j的空间分配只有一次。同时而每次循环均会对 j = 0;进行操作,而实际逻辑上是三个不同的空间。
-----------------------------------------------------------------------------------------------------------
这里用“空间”这个概念不够准确,存在某个环境真把它放相同的空间。应该强调这三个J是三个不同的对象!
(我仍然不想用对象这个词。哈。我更想强调是三个不同的逻辑存储区,无非实际情况下,更多的是在同一个存储区,诸如DSP的系统,类似的C代码逻辑,完全可以汇编成不同的存储区)

局部代码风格不太好,例如:

printf("the data is %d\n",(int)strtol(argv[2],&argv[2],10));

完全可以改为两个语句。

(这个只是给初学者看的,没有细纠,我更希望通篇的举例(不是陈述),是从不好的,有错的中,讨论错误,转移成好的。当然你的结论是完全正确的,哈)

加载中
0
中山野鬼
中山野鬼

@supermegaboy ,关于stdout是什么,我又重新翻阅了一下标准。是否是宏,我的理解出处在Index 部分,675 有如下内容

stdout,macro 7.21.1 等等。。。。而索引对于各个词,后续会给出类型,例如<stdio.h> header。
因此我的理解是 macro。当然在7.21.1中,只是提到了expression of type "pointer to FILE"。这里有个称述不清的概念。因此我更想按照Index部分的划分进行统一。如果有不同意见还希望你能给出讨论。谢谢。


0
中山野鬼
中山野鬼

关于标准中的变量,确实没有明确定义。但如我前面所说,标准自身的引述和直观的理解包括很多中文的翻译,仍然是保持着“变量”的叫法。例如,标准在6.7.6.1.3 130就指针声明给出了一个例子,如下摘抄:

EXAMPLE The following pair of declarations demonstrates the difference between a ‘‘variable pointer
to a constant value’’ and a ‘‘constant pointer to a variable value’’.
const int *ptr_to_constant;
int *const constant_ptr;

这段variable和其他很多地方都一样,强调的是可变,对应的反义词是 constant。而很多直观的理解,却容易将 variable value 误认为是"变量”。

当然我的描述确实有错误的地方,事实上标准并没有提到变量这个概念。此处后续会做修正。同样的,object,的名词我也会尽可能回避,而标准如你说的,确实是使用object。这年头,接触C的人,恐怕多半都会被面向对象的语言洗礼过。。。。怕了。哈。

返回顶部
顶部