>第 2 章 常量、变量和表达式>赋值

ddd ddd@clf.net
2008-12-03 19:57:45

int hour, minute;
hour = "Hello.";       /* WRONG ! */
minute = "59";         /* WRONG !! */
不会出现编译错误,只有编译警告


宋劲杉 songjinshan@akaedu.org
2008-12-07 16:02:25

您说得很对。十分感谢!我已经在原文里改过来了。


Laciq 530107999@qq.com
2009-06-21 11:59:29

据我所知,初始化只是给一个变量赋一个初值。而不是一种特殊的声明。初始化可以在声明一个变量后再进行。
Such as:
int num;
num = 5; // 对num这个变量进行初始化
与
Such as:
int num = 5; // 对num这个变量进行声明的同时对其进行初始化

很多时候在声明后在适当时候再使用一条语句对变量进行初始化更不容易出错,代码也变得更易读,代码效率也不会降低。如果在声明的同时就进行初始化,那么如果这个变量在后面几行没有使用,读代码的人往往就会忘记这个变量的值,读到使用这个变量的代码处时,还需要回头去看局部声明部分,导致代码变得不容易读。

不知道是您的书中的对还是《Computer Science:A Structured Programming Approach Using C》中的对。
不吝赐教


Laciq 530107999@qq.com
2009-06-21 12:09:47

建议增加副作用的概念,以使得讲解更加清晰。
例如:
int num;

num = 5 * 4; /* 首先计算整个表达式的值,即赋值运算符后面表达式值,即20。副作用即把20赋给num这个变量。
C语言中,有6个运算符会产生表达式的副作用:前缀增量和减量,后缀增量和减量、赋值和函数调用。
例如调用一个无返回值无参函数,就是为了实现这个函数的副作用。


Laciq 530107999@qq.com
2009-06-21 12:11:05

汗死。
楼上注释有问题
int num;

num = 5 * 4; /* 首先计算整个表达式的值,即***************赋值运算符后面表达式值,即***************20。副作用即把20赋给num这个变量。*********/


Laciq 530107999@qq.com
2009-06-21 12:11:58

- -!
排版被……
int num;

num = 5 * 4; /* 首先计算整个表达式的值,即赋值运算符后面表达式值,即20。副作用即把20赋给num这个变量。*/


宋劲杉 songjinshan@akaedu.org
2009-06-22 23:21:12

赋值和初始化根本不是这么定义的。看来你被那本什么Approach的书毒害了。


Laciq 530107999@qq.com
2009-06-24 11:36:09

我说的不是定义,而是过程。
在K&R中有一句“还可以在声明的同时对变量进行初始化”,这句话把声明和初始化分开来说,而且有同时二字,说明是既完成声明又完成初始化,可见初始化是可以在声明后进行的。既然可以在声明后进行,故初始化并非一种特殊的声明,而仅仅是赋初值。
这是我的理解,不知您是从何处获知初始化是一种特殊的声明的。
不吝赐教


宋劲杉 songjinshan@akaedu.org
2009-06-24 23:02:30

你的“初始化”是赋初值的意思,而我的“初始化”是一个语法上的概念。我发现很多地方你都在争论这种问题而非实质性的问题。
在我的书上对“初始化”就是这么定义的,这是一个严格的定义。我书上的定义都很严格,我不会乱用名词,自始至终,“初始化”都是一个语法上的概念,而非赋初值的意思。
如果你因为已经先入为主有了一个定义了,要么你必须接受我的定义才能看我的书,要么就没法看下去了。


Laciq 530107999@qq.com
2009-06-25 17:55:44

我是一个初学者,确实不知道定义是可以不同的。
也不知道什么是实质性问题,什么是非实质性问题。
所以我现在也觉得很迷茫。


宋劲杉 songjinshan@akaedu.org
2009-06-25 21:28:30

我的意思是,看编程书应该当数学书来看,而不是当语文书来看。比如你这一段论证:
你说K&R上有一句“可以在声明的同时对变量进行初始化”,这句话把声明和初始化分开来说,而且有同时二字,
说明是既完成声明又完成初始化==推出==>可见初始化是可以在声明后进行的。
注意你是怎么推出这个结论的。你是在分析那句话的说法,然后推出结论,而不是根据定义、定理、逻辑推理推出结论。
然而根据一句话的说法能推出结论吗?“可以在声明的同时对变量进行初始化”,它的另一面意思是“也可以在声明的同时
不对变量初始化”,而你却理解成“可以在声明之后对变量初始化”。当然,如果是一道高考语文题,你的理解也不算错,
因为自然语言本身就是有歧义的,怎么理解都对。但你仅靠这个推出结论,而不关心定义、定理、逻辑推理,那就是在
看语文书,而不是在看编程书了。
我从第一章就强调“以概念为中心的阅读思考习惯”,如果你改不了你的思维习惯,那么你不适合学编程。以后要学和
要理解的技术文档比我这个难得多了,也不可能有我解释得这么清楚。



Laciq 530107999@qq.com
2009-06-26 11:50:53

我想没有人在声明的同时不对变量的初始化之后仍不对变量进行初始化,或者说很少有人这样做,所以声明之后是一定可以对变量进行初始化的,所以我直接推出“可以在声明之后对变量初始化。略过了“也可以在声明的同时不对变量初始化“这个中间过程。
实际上我的思维过程就是这样的:说明是既完成声明又完成初始化而没有说初始化是一种特殊的声明==推出==>两者可分开==也可以在声明的同时不对变量初始化==一定可以在声明之后对变量初始化


宋劲杉 songjinshan@akaedu.org
2009-06-26 17:29:06

呵呵,还是那个问题。
在我的书上“初始化”是一个专有名词,是有严格定义的,你可以从书后的索引里找到Initialization这个名词,以及定义它的章节。我的定义是这样说的:变量的定义和赋值也可以一步完成,这称为变量的初始化(Initialization)。
而你的理解只把初始化看成是赋初值的意思,而不是一个专有名词。所以你的“初始化”比我的“初始化”涵盖的意思要广。
你说不知我是“从何处获知初始化是一种特殊的声明的”。我没有从别处获知,我不管别人怎么定义,在我这里就是这么定义的。


Tigerzk zoukai.tiger@126.com
2009-09-28 21:49:13

楼上的,概念不懂不要乱说哈,所谓初始化就是指在定义时赋值,定义之后在赋值就不是初始化了,只能叫赋值


Laciq dd@qq.com
2009-10-04 09:41:59

我后来翻了C99和C: A Reference Manual,Initialization确实是被归在Declarations中的。我说的定义不是Initialization,而我误以为是Initialization,所以不是标准定义,所以我的是错误的。
感谢LS的批评与指点,和宋老师的教诲。


Laciq dd@qq.com
2009-10-04 10:02:46

可以在声明的同时对变量进行初始化
和可以在吃东西的时候同时嚼东西是差不多的。
然而嚼东西和吃东西是不可分开的(大多数情况是这样),嚼东西归属于吃东西。
这里初始化也是归于声明中的,是声明的一个可选选项,那句话并不意味着初始化可以脱离声明。
我的理解有严重失误。


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!